Rdataframe的实际限制

我一直在阅读关于如何read.table对于大型数据文件无效。 另外R如何不适合大数据集。 所以我想知道在哪里可以find实际限制,以及(1)读取各种大小的数据的性能图表(2)处理不同大小的数据。

实际上,我想知道什么时候performance恶化,什么时候我碰到路障。 此外,任何与C ++ / MATLAB或其他语言的比较都将非常有帮助。 最后如果对Rcpp和RInside有什么特别的性能比较,那会很棒!

R适用于大型数据集,但是您可能不得不根据介绍性教科书的教导改变您的工作方式。 我在R的大数据(Big Data for R)上发了一篇文章,其中讨论了一个30 GB的数据集,您可能会发现这对灵感很有用。

通常的信息来源是高性能计算任务视图和R-SIG HPC的R-SIG HPC邮件列表。

你必须解决的主要限制是向2 ^ 31-1元素的向量的长度的历史限制,如果R没有将matrix存储为向量,那么这不会太坏。 (限制是为了与一些BLAS库兼容。)

我们定期使用R分析数百万客户的电话通话数据logging和市场营销数据库,如果您有兴趣,我们很乐意多谈。

物理限制来自向量上使用32位索引。 结果,允许向量2 ^ 31 – 1。 matrix是具有维度的向量,因此nrow(mat)nrow(mat)的乘积必须在2 ^ nrow(mat)之内。dataframe和列表是通用向量,因此每个分量可以取2 ^ 31-1个条目,这对于数据框意味着你可以有很多行列。 对于列表,您可以有2 ^ 31 – 1个组件,每个2 ^ 31 – 1个元素。 这是邓肯·默多克(Duncan Murdoch)最近发表的一篇关于R-Help问答的文章

现在所有人都必须使用标准R来适应内存,这可能是一个更加紧迫的限制,但其他人提到的高性能计算任务视图包含了可以规避内存问题的软件包的详细信息。

1)R导入/导出手册应该是第一个关于导入数据的问题的端口 – 有很多选项,什么可以为你的工作是非常具体的。

http://cran.r-project.org/doc/manuals/R-data.html

如果使用read.table提供的选项,特别是colClassescomment.charnrowsread.table特别大大提高了性能 – 这是因为这些信息必须从数据本身推断出来,这可能代价高昂。

2)数据框架或列表中的vector,matrix,数组,列的长度(元素的总数)有一个特定的限制。 这是由于在引擎下使用了32位索引,对于32位和64位R是真的。数字是2 ^ 31 – 1。这是data.frame的最大行数,但是它是如此之大,你甚至有可能用尽内存甚至单个载体,然后再开始收集其中的几个。

有关详细信息,请参阅help(Memory-limits)help(Memory)

一个单一的vector长度将需要几千兆字节的内存(取决于每个vector的types和存储模式 – 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 ,因为我对大数据集没有任何经验。 如果不提供colClasses参数, read.table执行效果不佳。 没有它, read.table默认为NA并尝试猜测每一列的一个类,这可能是缓慢的,尤其是当你有很多列。

当阅读大的CSV文件x GB <=> y.1e6 rows我认为data.table::fread (版本1.8.7)是最快的select,你可以让它做install.packages("data.table", repos="http://R-Forge.R-project.org")

你通常会得到一个5到10的因子(所有的seprow.names等都是由函数本身处理的)。 如果你有很多文件和一个足够好的计算机(几个内核),我推荐使用parallel包(作为R.2.14的一部分)为每个内核加载一个文件。

上次我在单线程加载read.csv和multithreading4核心使用fread之间做了这个,我从5分钟到20秒