2

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

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

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

4

4 回答 4

3

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

于 2012-11-01T22:09:17.790 回答
3

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

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

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

于 2012-11-05T10:05:27.357 回答
2

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

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

更新并查看以下评论​​;这个数字恐怕是低估了!

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

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

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

于 2012-11-01T21:57:53.053 回答
1

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

于 2012-11-01T22:08:02.233 回答