合并data.frames会导致内存不足错误

时间:2012-04-10 23:02:22

标签: linux r memory-management data.table

我有4GB的内存,根据我收到的错误消息Error: cannot allocate vector of size 147.6 Mb,在Linux中的R内存中将147.6MB拉入内存时遇到问题:IDs <- read.csv('Set1.csv') # 2 MB Set2 <- read.csv('Set2.csv') # 240 MB data <- merge(IDs, Set2, by='MemberID') rm(IDs) # Remove junk! rm(Set2) # Remove junk! gc() print('First merge complete') Set3 <- read.csv('Set3.csv') # 25 MB data <- merge(data, Set3, by='MemberID') rm(Set3) # Remove junk! gc() print('Second merge complete')

我该如何诊断?

这是我的代码:

> print(object.size(IDs), units="Mb")
1.3 Mb
> print(object.size(Set2), units="Mb")
142.6 Mb
> print(object.size(Set3), units="Mb")
12.5 Mb

执行在第一个print语句后停止。我无法理解额外的内存使用来自何处。看看R中关于memory()的文档,它似乎是一个连续的内存问题?有没有办法在Ubuntu上的R中解决这个问题?

另外还看了其他人在这里提出类似的问题,但提出的解决方案是针对Windows的。

编辑1

有些评论可以解决以下评论:

Error: cannot allocate vector of size 147.6 Mb

因此,看起来这些对象的大小不会因为从CSV读入而变得太大。我将检查data.table()和其余的......

编辑2

我已更新我的代码以使用data.table()并具有相同的错误。这让我担心,也许它对我的机器来说有点特别?这对于涉及的文件大小来说似乎很奇怪。 IDs <- as.data.table(read.csv('Set1.csv')) # 2 MB Set2 <- as.data.table(read.csv('Set2.csv')) # 240 MB data <- merge(IDs, Set2, by='MemberID') rm(IDs) # Remove junk! rm(Set2) # Remove junk! gc() print('First merge complete') Set3 <- as.data.table(read.csv('Set3.csv')) # 25 MB data <- merge(data, Set3, by='MemberID') rm(Set3) # Remove junk! gc() print('Second merge complete')

{{1}}

编辑3

通过我的数据检查,我怀疑问题可能在这里。在Set3.csv中有一些常见的字段名称,所以我认为它正在做令人讨厌的n x n连接或其他东西。

2 个答案:

答案 0 :(得分:0)

在上面的评论中建议切换到data.table()作为@Chase,并且大量删除使用的对象允许我处理第一次合并。事实证明,后来导致麻烦的合并实际上是在我没想到的地方进行笛卡尔连接,因为第二个数据集具有非唯一键,所以我不得不完全放弃。

我通过对数据进行子集化暂时解决了这个问题,但是在尝试将模型拟合到预测中时,我遇到了类似的错误。

故事的寓意是R函数使用的内存大于传入矢量本身的大小,正如@Justin上面所建议的那样,使用object.size来衡量。类似地,对于在处理操作期间耗尽RAM的功能。

答案 1 :(得分:0)

我有一个非常类似的问题。我的问题是我将NA引入了两个数据帧的“by”列。

最终导致了一个非常大的数据帧。用NA修复或删除行解决了问题。