【问题标题】:how to read a large file in blocks efficiently in R如何在 R 中有效地读取块中的大文件
【发布时间】:2011-12-27 12:42:49
【问题描述】:

我正在读取 R 中的一个大型事件文件,接近 200 万行,将每一行解析为一组事件属性并存储在我的矩阵中。我预先分配了一个巨大的矩阵(200 万个事件),从文件中读取一小块,重复并处理它。但是处理文件花费的时间太长。我想知道我能做些什么来提高性能。这是我的代码 sn-p:

numEvents <<- 2000000;
eventLog <<- matrix(0,nrow=numEvents,ncol=4);

loadEvents <- function(inputfile) {
    con <- file(inputfile, "r", blocking = FALSE)
    batch <- 1000
    lines <- readLines(con,n=batch)
    while(length(lines) > 0 && eventCount <= numEvents) {
        for (i in 1:length(lines))
            storeEvent(lines[i]); # processes and stores each event in eventlog
        lines <- readLines(con,n=batch)
    }
    close(con);
}

您认为批量大小不是最优的吗?

非常感谢这里的任何想法。

【问题讨论】:

  • 2m 行对我来说似乎不是很大。您的性能问题可能与读取文件无关,而是您没有对处理函数进行矢量化。
  • 处理函数相当简单。它从文件中读取属性并应用一些条件,然后将其存储在事件日志的下一个索引中。没有矢量化的余地。我认为有可能优化我读取文件的方式..
  • 永远不要说没有向量化的空间......你能告诉我们这个解析是什么样子吗?
  • 它在本质上有点专有,所以我不能在这里发布。我试图增加批量大小,它对性能有积极影响。所以我试图找到最佳的批量大小。

标签: r file-io


【解决方案1】:

也许您的案例是 R extension(在 C 或 C++ 中)的好案例?但是我不太懂R。

【讨论】:

【解决方案2】:

在我的处理过程中发现了问题。我使用列表作为地图来包含事件的映射。 List 本质上不是哈希映射,因此它可能非常慢。我将其更改为使用 hash() 并且性能提高了十倍。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多