如何在R中获得更好的性能:一个大文件或几个小文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在R中获得更好的性能:一个大文件或几个小文件?相关的知识,希望对你有一定的参考价值。

我有大约200个不同的文件(所有这些都是大矩阵,465x1080)(这对我来说很重要)。然后我使用cbind2使它们成为一个更大的矩阵(465x200000)。

我之所以这样做是因为我需要为每一行创建一个单独的文件(465个文件),我认为R更容易将数据从1个文件加载到内存中只有ONCE,然后只读取每行的行创建一个单独的行每个文件的文件,而不是每行打开和关闭200个不同的文件。

这真的是更快的方式吗? (我很想知道,因为现在它需要做很多事情)。当我从Windows检查任务管理器时,它显示了R使用的RAM,它一直从700MB到1GB到700MB(每秒两次)。好像主文件没有加载一次,但它在每次迭代中都是从内存中加载和擦除的(这可能是它有点慢的原因?)。

我是初学者,所以我写的所有这些都没有任何意义。

这是我的代码:(那些+1和-1是因为原始数据有1个额外的列,我不需要在新文件中)

extractStationData <- function(OriginalData, OutputName = "BCN-St") {

for (i in 1:nrow(OriginalData)) {

    OutputData <- matrix(NA,nrow = ncol(OriginalData)-1,3)
    colnames(OutputData) <- c("Time","Bikes","Slots")

    for (j in 1:(ncol(OriginalData)-1)) {

        OutputData[j,1] <- colnames(OriginalData[j+1])
        OutputData[j,2] <- OriginalData[i,j+1]

    }

    write.table(OutputData,file = paste(OutputName,i,".txt",sep = ""))
    print(i)

}

}

有什么想法吗?也许我应该在第一个for循环之前创建一个对象(巨大的文件),然后它只会加载一次?

提前致谢。

答案

让我们假设您已经创建了465x200000矩阵,并且有问题的只是extractStationData函数。然后我们可以修改它,例如:

require(data.table)
extractStationData <- function(d, OutputName = "BCN-St") {
  d2 <- d[, -1] # remove the column you do not need
  # create empty matrix outside loop:
  emtyMat <- matrix(NA, nrow = ncol(d2), 3)
  colnames(emtyMat) <- c("Time","Bikes","Slots")
  emtyMat[, 1] <- colnames(d2)
  for (i in 1:nrow(d2)) {
    OutputData <- emtyMat
    OutputData[, 2] <- d2[i, ]
    fwrite(OutputData, file = paste(OutputName, i, ".txt", sep = "")) # use fwrite for speed
  }
}

V2:

如果你的OriginalData是矩阵格式,这种创建新data.tables列表的方法看起来非常快:

extractStationData2 <- function(d, OutputName = "BCN-St") {
  d2 <- d[, -1] # romove the column you dont need
  ds <- split(d2, 1:nrow(d2))
  r <- lapply(ds, function(x) {
    k <- data.table(colnames(d2), x, NA)
    setnames(k, c("Time","Bikes","Slots"))
    k
  })
  r
}
dl <- extractStationData2(d) # list of new data objects
# write to files:
for (i in seq_along(dl)) {
  fwrite(dl[[i]], file = paste(OutputName, i, ".txt", sep = ""))
  }

也应该为data.frame做一些微小的改变:k <- data.table(colnames(d2), t(x), NA)

以上是关于如何在R中获得更好的性能:一个大文件或几个小文件?的主要内容,如果未能解决你的问题,请参考以下文章

linux 如何将一个大文件分成几个小文件

在 R 中处理个人功能的最佳实践

选择性地获取核心数据以获得更好的性能(稍后获取大项目)

哪一个更可能浪费更少的内存,一个大内存管理器或几个小内存管理器? [关闭]

如何把一个或几个CSV文件中的数据读取到Excel表格中

几个小设置让 mac 更好用