R数据帧的实际限制

Ego*_*gon 49 performance r dataframe rcpp

我一直在阅读read.table如何对大数据文件无效.R也不适用于大型数据集.所以我想知道在哪里可以找到实际限制和任何性能图表(1)读取各种尺寸的数据(2)处理不同大小的数据.

实际上,我想知道性能何时恶化以及何时遇到路障.对C++/MATLAB或其他语言的任何比较都会非常有用.最后如果Rcpp和RInside有任何特殊的性能比较,那就太棒了!

All*_*rdt 50

[R 适用于大型数据集,但你可能要改变你从什么入门教材教你有些工作方式.我在Big Data for R上做了一篇文章,它发布了一个30 GB的数据集,你可能会发现它对灵感有用.

信息通常来源上手是高性能计算任务视图,并在R-SIG HPC邮件列表R-SIG HPC.

您必须解决的主要限制是对2 ^ 31-1元素的向量长度的历史限制,如果R不将矩阵存储为向量,则不会如此糟糕.(限制是为了与某些BLAS库兼容.)

我们定期使用R对数百万客户分析电话通话数据记录和营销数据库,如果您有兴趣,我们很乐意多说话.

  • @Egon:我的背景是这样的,我对任何数据分析问题的第一直觉是启动文本编辑器和Fortran编译器.但是现在我发现分析中的限制因素更多是我找出正确方法并将其转化为代码的时间.为此,R对我来说更有成效.当然,在使用R时我必须仔细考虑性能,但事实上你必须使用已编译的代码.我确实有一些我们编译过的元素,但它们相对较少,几乎都是在R中设计和测试的.这就是R更快的原因. (7认同)

Rei*_*son 29

物理限制源于在向量上使用32位索引.结果,允许最多2 ^ 31-1的向量.矩阵是与尺寸矢量,所以对产品nrow(mat)ncol(mat)必须在2 ^ 31 - 1.数据帧和列表是通用的载体,因此,每个部件可采取2 ^ 31 - 1个条目,该数据帧的装置,则可以有许多行列.对于列表,您可以拥有2 ^ 31 - 1个组件,每个组件包含2 ^ 31 - 1个元素.这是来自Duncan Murdoch 最近发表的一篇关于R-Help问答的回复

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

  • 请注意,2^31 - 1 个元素的限制仅适用于 R 2.xy 在 R 3.xy 中,限制更高(请参阅 https://cran.r-project.org/doc/manuals/R-ints.html #长向量)。 (3认同)

mds*_*ner 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


aL3*_*3xa 8

我只能回答一个问题read.table,因为我对大数据集没有任何经验.read.table如果你不提供colClasses参数,表现不佳.没有它,read.table默认NA并尝试猜测每列的类,这可能很慢,尤其是当你有很多列时.


sta*_*ant 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秒