我一直在阅读有关 read.table 对大型数据文件的效率不高的信息。还有 R 是如何不适合大型数据集的。所以我想知道在哪里可以找到实际限制是什么以及任何性能图表(1)读取各种大小的数据(2)使用不同大小的数据。
实际上,我想知道性能何时下降以及何时遇到障碍。此外,任何与 C++/MATLAB 或其他语言的比较都会非常有帮助。最后,如果 Rcpp 和 RInside 有什么特别的性能对比,那就太好了!
我一直在阅读有关 read.table 对大型数据文件的效率不高的信息。还有 R 是如何不适合大型数据集的。所以我想知道在哪里可以找到实际限制是什么以及任何性能图表(1)读取各种大小的数据(2)使用不同大小的数据。
实际上,我想知道性能何时下降以及何时遇到障碍。此外,任何与 C++/MATLAB 或其他语言的比较都会非常有帮助。最后,如果 Rcpp 和 RInside 有什么特别的性能对比,那就太好了!
R适用于大型数据集,但您可能需要根据入门教科书的内容改变您的工作方式。我在Big Data for R上发表了一篇文章,它处理了一个 30 GB 的数据集,您可能会发现它对灵感很有用。
入门信息的常用来源是高性能计算任务视图和 R-SIG HPC 上的R -SIG HPC 邮件列表。
您必须解决的主要限制是将向量长度限制为 2^31-1 个元素的历史限制,如果 R 不将矩阵存储为向量,这不会那么糟糕。(限制是为了与某些 BLAS 库兼容。)
我们定期使用 R 分析数百万客户的电信呼叫数据记录和营销数据库,因此如果您有兴趣,我们很乐意多谈。
物理限制源于对向量使用 32 位索引。因此,最多允许 2^31 - 1 的向量。nrow(mat)
矩阵是具有维度的向量,因此和的乘积ncol(mat)
必须在 2^31 - 1 之内。数据框和列表是通用向量,因此每个组件可以采用 2^31 - 1 个条目,这对于数据框意味着您可以拥有那么多行和列。对于列表,您可以有 2^31 - 1 个组件,每个组件有 2^31 - 1 个元素。这摘自邓肯·默多克最近在 R-Help 上回复 Q 的帖子
现在所有东西都必须适应标准 R 的 RAM,所以这可能是一个更紧迫的限制,但是其他人提到的高性能计算任务视图包含可以规避内存问题的包的详细信息。
1) R 导入/导出手册应该是有关导入数据的问题的第一站 - 有很多选项,对您有用的可能非常具体。
http://cran.r-project.org/doc/manuals/R-data.html
read.table
如果使用提供给它的选项,特别是colClasses
,comment.char
和nrows
- 这是因为必须从数据本身推断出这些信息,这可能会很昂贵。
2) data.frame 或列表中的任何向量、矩阵、数组、列的长度(元素总数)都有特定的限制。这是由于在底层使用了 32 位索引,对于 32 位和 64 位 R 也是如此。数字是 2^31 - 1。这是 data.frame 的最大行数,但是它是如此之大,以至于在开始收集其中几个之前,即使是单个向量也更有可能耗尽内存。
有关详细信息,请参见help(Memory-limits)
和help(Memory)
。
该长度的单个向量将占用许多 GB 的内存(取决于每个向量的类型和存储模式 - 数字为 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
我只能回答关于 的问题read.table
,因为我对大型数据集没有任何经验。read.table
如果您不提供colClasses
论据,则表现不佳。没有它,read.table
默认NA
并尝试猜测每一列的一个类,这可能会很慢,尤其是当你有很多列时。
在阅读大型 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 秒