我有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连接或其他东西。
答案 0 :(得分:0)
在上面的评论中建议切换到data.table()
作为@Chase,并且大量删除使用的对象允许我处理第一次合并。事实证明,后来导致麻烦的合并实际上是在我没想到的地方进行笛卡尔连接,因为第二个数据集具有非唯一键,所以我不得不完全放弃。
我通过对数据进行子集化暂时解决了这个问题,但是在尝试将模型拟合到预测中时,我遇到了类似的错误。
故事的寓意是R函数使用的内存大于传入矢量本身的大小,正如@Justin上面所建议的那样,使用object.size
来衡量。类似地,对于在处理操作期间耗尽RAM的功能。
答案 1 :(得分:0)
我有一个非常类似的问题。我的问题是我将NA引入了两个数据帧的“by”列。
最终导致了一个非常大的数据帧。用NA修复或删除行解决了问题。