2011-03-08 130 views
45

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

实际上,我想知道什么时候性能会降低,当我打了一个路障。此外,任何与C++/MATLAB或其他语言的比较都会非常有用。最后如果Rcpp和RInside有任何特别的性能比较,那会很棒!

+1

的[高性能任务视图(HTTP://cran.r-project .org/web/views/HighPerformanceComputing.html)几乎肯定会回答这些问题中的一部分。 – Chase 2011-03-08 14:32:23

+0

Rcpp是封装了R C API的C++库,而RInside提供了从C++代码调用R的功能。也就是说,他们都受到R的约束。 – 2011-03-08 14:54:24

+0

http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r – 2015-10-13 14:22:07

回答

46

R 适合大型数据集,但您可能不得不改变自己的教学方法。我在Big Data for R上发布了一篇文章,其中讨论了一个30 GB的数据集,您可能会发现它对灵感有帮助。

通常的信息来源是High-Performance Computing Task View和R-SIG HPC邮件列表R-SIG HPC

你必须解决的主要限制是在载体上的长度为2^31-1元件,其也不会这么糟糕如果R不矩阵存储为矢量的历史极限。 (极限是与一些BLAS库的兼容性。)

我们定期分析电信呼叫数据记录和营销数据库多万客户使用R,所以会很乐意谈论更多,如果你有兴趣。

+0

你有任何统计数据有多少嘎吱嘎吱地使用R,比说C++类语言慢多少? Thnx - Egon – Egon 2011-03-08 16:14:59

+7

@Egon:我的背景是这样的,我的任何数据分析问题的本能就是激发一个文本编辑器和一个Fortran编译器。但是现在我发现分析中的限制因素更多的是我找出正确的方法并将其转化为代码。为此,R对我来说更加高效。当然,在使用R时我必须仔细考虑性能,但实际上你必须使用编译代码。我确实有一些我们已编译的元素,但它们相对较少,几乎都是先在R中进行设计和测试。这就是为什么R更快。 – 2011-03-08 19:16:35

8

我只能回答一个有关read.table,因为我没有处理大型数据集的经验。如果您不提供colClasses参数,则read.table表现不佳。没有它,read.table默认为NA,并试图猜测每一列的一个类,并且可能会很慢,特别是当您有很多列时。

26

的物理限制从载体使用的32位索引产生。结果,允许向量高达2^31 - 1。矩阵是与尺寸矢量,所以nrow(mat)ncol(mat)产品必须在2^31 - 1.数据帧和列表是通用的载体,因此,每个部件可采取2^31 - 1个条目,该数据帧的装置,则可以有多行列。对于列表,您可以有2^31 - 1个组件,每个2^31 - 1个元素。这是从Duncan Murdoch最近的一个posting得出的回复Q上的R帮助

现在所有的都必须适合内存与标准R,以便可能是一个更紧迫的限制,但High-Performance Computing任务视图,其他人已经提到包含可以规避内存问题的软件包的详细信息。

+0

请注意,2^31 - 1元素的限制仅适用于R 2.x.y.在R 3.x.y中,限制更高(请参阅https://cran.r-project.org/doc/manuals/R-ints.html#Long-vectors)。 – esel 2018-03-08 14:27:32

13

1)将R导入/导出手册应该是通话的第一口有关导入数据的问题 - 有很多选择,什么会为你的可能是非常具体的工作。

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

read.table具体大大改善性能,如果提供给它的选择的使用,特别colClassescomment.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任务视图高性能计算是实现这一目标的良好资源。

最后,如果你的内存堆栈(16GB或更多),需要64位索引它可能出现在未来的R.释放http://www.mail-archive.com/[email protected]/msg92035.html

此外,罗斯·哈卡讨论了一些历史的决策和未来在论文方向为就像语言中的R和了会谈: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks

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秒这样做单线程负载之间