看起来 R 真的是为处理可以完全拉入内存的数据集而设计的。推荐哪些 R 包用于无法拉入内存的超大型数据集的信号处理和机器学习?
如果 R 只是错误的方法,我愿意接受其他强大的免费建议(例如 scipy,如果有一些很好的方法来处理非常大的数据集)
看起来 R 真的是为处理可以完全拉入内存的数据集而设计的。推荐哪些 R 包用于无法拉入内存的超大型数据集的信号处理和机器学习?
如果 R 只是错误的方法,我愿意接受其他强大的免费建议(例如 scipy,如果有一些很好的方法来处理非常大的数据集)
查看CRAN 上高性能计算任务视图的“大内存和内存不足数据”小节。bigmemory和ff是两个流行的软件包。对于 bigmemory(以及相关的biganalytics和bigtabulate),bigmemory 网站上有一些来自 Jay Emerson 的非常好的演示文稿、小插曲和概述。对于 ff,我推荐阅读 Adler Oehlschlägel 及其同事在ff 网站上的精彩幻灯片演示。
此外,考虑将数据存储在数据库中并以较小的批次读取数据以进行分析。可能有许多方法需要考虑。首先,请查看biglm包中的一些示例,以及Thomas Lumley 的演示文稿。
并调查高性能计算任务视图中的其他包,并在其他答案中提到。我上面提到的软件包只是我碰巧有更多经验的软件包。
我认为您可以处理的数据量更多地受到编程技能的限制。尽管许多标准功能都集中在内存分析中,但将数据分成块已经很有帮助。当然,这比编写标准的 R 代码需要更多的时间来编程,但通常情况下是很有可能的。
例如,可以使用仅支持读取数据子集的 read.table 或 readBin 来完成数据切割。或者,您可以查看提供开箱即用内存外功能的软件包的高性能计算任务视图。您还可以将数据放入数据库中。对于空间栅格数据,优秀的栅格包提供内存不足分析。
这完全取决于您需要的算法。如果它们可以转换为增量形式(当在任何给定时刻只需要一小部分数据时,例如对于朴素贝叶斯,您可以只将模型本身和当前正在处理的观察保存在内存中),那么最好的建议是执行机器增量学习,从磁盘读取新批次的数据。
然而,许多算法,尤其是它们的实现确实需要整个数据集。如果数据集的大小适合您的磁盘(和文件系统限制),您可以使用mmap包,该包允许将磁盘上的文件映射到内存并在程序中使用它。但是请注意,对磁盘的读写成本很高,而且 R 有时喜欢频繁地来回移动数据。所以要小心。
如果您的数据甚至无法存储在硬盘上,您将需要使用分布式机器学习系统。一个这样的基于 R 的系统是Revolution R,它旨在处理非常大的数据集。不幸的是,它不是开源的并且要花很多钱,但是您可以尝试获得免费的学术许可证。作为替代方案,您可能对基于 Java 的Apache Mahout感兴趣- 不是那么优雅,但非常有效的解决方案,基于 Hadoop 并包含许多重要算法。
如果内存不够,一种解决方案是将数据推送到磁盘并使用分布式计算。我认为 RHadoop(R+Hadoop) 可能是处理大量数据集的解决方案之一。