我一直在阅读read.table如何对大数据文件无效。 R也不适用于大型数据集。所以我想知道在哪里可以找到实际限制和任何性能图表(1)读取各种尺寸的数据(2)处理不同大小的数据。
实际上,我想知道性能何时恶化以及何时遇到路障。对C ++ / MATLAB或其他语言的任何比较都会非常有用。最后,如果Rcpp和RInside有任何特殊的性能比较,那就太棒了!
答案 0 :(得分:49)
适用于大型数据集,但您可能需要根据入门教材的教学方式改变您的工作方式。我在Big Data for R上发了一篇文章,其中包含一个30 GB的数据集,您可能会发现它对于灵感有用。
通常的信息来源是High-Performance Computing Task View和R-SIG HPC的R-SIG HPC邮件列表。
你必须解决的主要限制是对2 ^ 31-1元素的向量长度的历史限制,如果R没有将矩阵存储为向量,那么这种限制就不会那么糟糕。 (限制是为了与某些BLAS库兼容。)
我们定期使用R对数百万客户分析电话通话数据记录和营销数据库,如果您有兴趣,我们很乐意多谈。
答案 1 :(得分:27)
物理限制源于在向量上使用32位索引。结果,允许最多2 ^ 31-1的向量。矩阵是具有维度的向量,因此nrow(mat)
和ncol(mat)
的乘积必须在2 ^ 31 - 1之内。数据帧和列表是一般向量,因此每个组件可以占用2 ^ 31 - 1个条目,对于数据框,这意味着您可以拥有多行和列。对于列表,您可以拥有2 ^ 31 - 1个组件,每个组件包含2 ^ 31 - 1个元素。这是来自Duncan Murdoch最近posting回复关于R-Help的问答
现在所有人都必须使用标准R来适应RAM,这可能是一个更紧迫的限制,但其他人提到的High-Performance Computing任务视图包含可以绕过内存中问题的软件包的详细信息。 / p>
答案 2 :(得分:13)
1)R导入/导出手册应该是关于导入数据的问题的第一个停靠点 - 有很多选项,对你来说可能非常具体。
http://cran.r-project.org/doc/manuals/R-data.html
如果使用提供给它的选项, read.table
特别大大提高了效果,特别是colClasses
,comment.char
和nrows
- 这是因为此信息必须是从数据本身推断,这可能是昂贵的。
2)data.frame或list中的任何向量,矩阵,数组,列的长度(元素总数)都有特定限制。这是由于引擎盖下使用了32位索引,对于32位和64位R是正确的。数字是2 ^ 31 - 1.这是data.frame的最大行数,但是它是如此之大,在开始收集其中几个之前,你甚至更不可能为单个向量耗尽内存。
有关详细信息,请参阅help(Memory-limits)
和help(Memory)
。
这个长度的单个向量将占用许多千兆字节的内存(取决于每个向量的类型和存储模式 - 数字为17.1)所以它不太可能是一个适当的限制,除非你真的在推动事物。如果你真的需要超越可用的系统内存(这里是64位),那么导入/导出手册中讨论的标准数据库技术,或内存映射文件选项(如ff
包),值得考虑。 CRAN任务视图高性能计算是这方面的一个很好的资源。
最后,如果你有堆栈的RAM(16Gb或更多)并且需要64位索引,它可能会在将来的R版本中出现。http://www.mail-archive.com/r-help@r-project.org/msg92035.html
此外,Ross Ihaka在论文和会谈中讨论了R语言的一些历史决定和未来方向: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks
答案 3 :(得分:8)
我只能回答有关read.table
的问题,因为我对大数据集没有任何经验。如果您不提供read.table
参数,colClasses
表现不佳。没有它,read.table
默认为NA
并尝试猜测每列的类,这可能很慢,尤其是当你有很多列时。
答案 4 :(得分:7)
在阅读大型csv文件x GB <=> y.1e6 rows
时,我认为data.table::fread
(从版本1.8.7开始)是您可以做到的最快的替代方法install.packages("data.table", repos="http://R-Forge.R-project.org")
您通常会获得5到10的因子(所有sep
,row.names
等都由函数本身处理)。如果你有很多文件和足够好的计算机(几个核心),我建议使用parallel
包(作为R.2.14的一部分)为每个核心加载一个文件。
上次我在使用read.csv
的单线程加载和4核上的多线程之间执行此操作时使用fread
我从5分钟到20秒