【发布时间】:2013-07-09 21:27:58
【问题描述】:
我想知道使用 data.table fread 函数可以读取的行数是否有限制。我正在处理一个有 40 亿行、4 列、大约 40 GB 的表。看起来 fread 只会读取前 8.4 亿行。它没有给出任何错误,而是返回到 R 提示符,就好像它已经读取了所有数据一样!
我知道 fread 目前不适合“产品使用”,并且想了解是否有任何时间框架来实施产品发布。
我使用 data.table 的原因是,对于这种大小的文件,与将文件加载到 data.frame 等相比,它在处理数据方面非常有效。
目前,我正在尝试其他 2 个替代方案 -
1) 使用扫描并传递给 data.table
data.table(matrix(scan("file.csv",what="integer",sep=","),ncol=4))
Resulted in --
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
too many items
2) 将文件分成多个单独的段,限制为大约。使用 Unix 拆分 5 亿行并按顺序读取它们……然后将文件按顺序循环到 fread - 有点麻烦,但似乎是唯一可行的解决方案。
我认为可能有一种 Rcpp 方式可以更快地做到这一点,但不确定它通常是如何实现的。
提前致谢。
【问题讨论】:
-
确保文件的最后一行或之后的行没有异常,然后submit 报告错误或联系包管理员。
-
你确定你有足够的内存吗?你在使用 64 位 R 吗?
-
不,Rcpp 不一定有更快的方法,因为 Matt 已经使用 mmap。检查您的操作系统文档以了解 mmap 调用的限制。数十亿人可能正在推动它......
-
回复:读取文件的更快方法,...根据我的经验,使用原生 KDB+ (kx.com) 可以在几分钟内完成此类任务。鉴于它是用 C 编写的(据我所知),我想知道我们是否可以在 R 中实现相同的速度...... KDB 也对文件进行 mmap,但使用了一些超级优化的代码(整个 db 二进制文件就像 1 Meg !) .有点跑题了,但还是很有趣。
-
@CauchyDistributedRV:R 之前 3.0.0 被限制为 2^31 - 1; R 3.0.0 后来通过双精度切换到索引来移动它。有关更多信息,请参阅 NEWS 文件,但我记得现在是 2^35 - 1。也就是说,您的观点仍然有效。
标签: r data.table rcpp