使用非常大的数据集在R中工作

时间:2012-11-01 21:51:17

标签: r

我正在处理从Oracle数据库下载的非常大的数据集。数据框有大约2100万行和15列。 我的操作系统是windows xp(32位),我有2GB内存。短期我不能升级我的RAM或我的操作系统(它正在工作,我需要几个月才能获得一台不错的电脑)。

library(RODBC)
sqlQuery(Channel1,"Select * from table1",stringsAsFactor=FALSE)

我到这里已经坚持了通常的“无法将xMb分配给矢量”。 我发现了一些关于使用ff包的建议。我很高兴知道是否有任何熟悉ff包的人可以告诉我它是否对我的情况有所帮助。 你知道另一种解决内存问题的方法吗? 64位解决方案会有帮助吗? 谢谢你的建议。

4 个答案:

答案 0 :(得分:3)

根据我的经验,以块的形式处理数据几乎总能帮助处理大数据。例如,如果计算时间平均值,则在任何给定时间内只需要在内存中存在一个时间步长。您已将数据存储在数据库中,因此很容易获得子集。或者,如果您无法轻松处理数据块,则可以尝试获取数据的子集。重复分析几次,看看您的结果是否对您采用的子集敏感。最重要的是,一些聪明的想法可以让你获得2 Gb的RAM。如果您需要更具体的建议,您需要提出更具体的问题。

答案 1 :(得分:3)

如果您正在使用软件包ff并在SQL中使用数据,则可以使用软件包ETLUtils轻松地使用ff获取它们,请参阅文档以获取使用ROracle时的示例。

根据我的经验,ff非常适合您正在使用的数据集类型(21 Mio行和15列) - 实际上您的设置有点小到ff,除非您的列包含大量字符数据被转换为因子(意味着所有因子水平应该能够适合你的RAM)。 包ETLUtils,ff和包ffbase允许您使用ff在R中获取数据并对其执行一些基本统计。根据您对数据,硬件的处理方式,您可能必须在构建模型时考虑采样。我更喜欢在R中使用我的数据,使用ff中的工具(如chunking)或者ffbase包中的工具构建基于样本和分数的模型。

缺点是你必须习惯你的数据是ffdf对象这可能需要一些时间 - 特别是如果你是R的新手。

答案 2 :(得分:2)

很抱歉我对ff无能为力,但关于RAM的主题:我不熟悉R数据帧的内存使用情况,但为了论证,我们假设每个单元需要8个字节(例如双精度浮点数或长整数)。

2100万* 15 * 8字节=约2.5 GB。

更新并查看以下评论​​;这个数字可能是低估的!

所以你可以真正做更多的RAM,而64位机器会有很大的帮助,因为32位机器限制在4GB(并且不能完全使用它)。

可能值得尝试数据集的一个子集,以便您知道可以使用现有RAM加载多少,然后推断以估计实际需要的数量。如果你可以细分数据并以块的形式处理它,那就太好了,但是很多问题都不能轻易地提交给这种方法。

另外,我一直认为你需要所有的栏目!显然,如果您可以以任何方式过滤数据以减小尺寸(例如删除任何不相关的列),那么这可能会有很大帮助!

答案 3 :(得分:1)

还有一个非常相似的question。特别是,处理数据的一种方法是将其写入文件,然后将内存区域映射到该文件(例如,参见mmap包)。