【问题标题】:ff package write errorff 包写入错误
【发布时间】:2012-12-11 02:28:58
【问题描述】:

我正在尝试使用 R 处理 1909x139352 数据集。由于我的计算机只有 2GB 的 RAM,因此数据集对于传统方法来说太大了 (500MB)。所以我决定使用ff 包。但是,我遇到了一些麻烦。函数read.table.ffdf 无法读取第一块数据。它会因下一个错误而崩溃:

txtdata <- read.table.ffdf(file="/directory/myfile.csv", 
                           FUN="read.table", 
                           header=FALSE, 
                           sep=",", 
                          colClasses=c("factor",rep("integer",139351)), 
                          first.rows=100, next.rows=100, 
                          VERBOSE=TRUE)

  read.table.ffdf 1..100 (100)  csv-read=77.253sec
  Error en  ff(initdata = initdata, length = length, levels = levels, ordered = ordered,  : 
   write error

有人知道发生了什么吗?

【问题讨论】:

  • 错误信息不清楚。只是“写错误”吗?

标签: r ff ffbase


【解决方案1】:

此错误消息表明您打开的文件过多。在 ff 中,您的 ffdf 中的每一列都是一个文件。您只能打开有限数量的文件 - 而您已经达到了该数量。请参阅我在Any ideas on how to debug this FF error? 上的回复。

因此,在您的情况下,仅使用 read.table.ffdf 将不起作用,因为您有 139352 列。但是可以在 ff 中导入它,但在打开列时需要小心,同时在 RAM 中获取数据以避免此问题。

【讨论】:

  • 谢谢!那么我应该怎么做才能在ff中导入呢?
  • 您需要重载 ff 包中的函数“[
  • @jwijffels,我发布了一个替代答案,使人们可以在没有您描述的分组的情况下使用 ffdf。我想你可能会觉得它有帮助 - YMMV。我非常感谢您提到的重载示例,因为当您无权更改最大打开文件设置时,这将很有帮助。
【解决方案2】:

你的数据集真的没那么大.. 如果你说一下你想用它做什么,它可能会有所帮助。 这可能会有所帮助:Increasing Available memory in R 要么 如果这不起作用,则 data.table 包非常快,并且在使用 := 运算符操作 data.tables 时不会占用内存。
和 至于 read.table.ffdf,请查看此内容。read.table.ffdf tutorial,如果您仔细阅读,它会提供有关使用 gc() 等命令优化内存使用的提示和详细信息。

【讨论】:

  • 并且 data.table 在 1.8.7 中有新的内容,但这是非常新的。我在我的 2GB 内存上网本上加载了大于 500MB 的文件,但它是 64 位的,fread 需要可寻址性。值得快速尝试@jairos。
  • 谢谢你们!我决定使用 ff 是因为之前尝试使用 read.table 的尝试都没有成功。由于过度使用 RAM,我的计算机会变得非常慢。也许文件不是那么大,但数据集有大约 140,000 列,这是真正的问题。我将尝试 de data.table 函数并让您知道。
【解决方案3】:

我最近在一个大约有 3,000 列的数据框中遇到了这个问题。解决此问题的最简单方法是调整允许为您的用户帐户打开的最大文件数。典型系统设置为 ~ 1024,这是一个非常保守的限制。 请注意,它设置为防止服务器上的资源耗尽。

在 Linux 上:

将以下内容添加到您的 /etc/security/limits.conf 文件中。

youruserid hard nofile 200000 # you may enter whatever number you wish here youruserid soft nofile 200000 # whatever you want the default to be for each shell or process you have running

在 OS X 上:

在您的/etc/sysctl.con 文件中添加或编辑以下内容。 kern.maxfilesperproc=200000 kern.maxfiles=200000

您需要注销并重新登录,但原始发布者将能够使用 ffdf 打开他的 139352 列数据框。

我已经发布了有关my run-in with this limit here 的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2012-10-15
    • 1970-01-01
    • 2013-03-13
    • 2016-04-25
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多