根据我收到的错误消息,我有 4GB 的 RAM,并且无法在 Linux 的 R 中将 147.6MB 拉入内存:Error: cannot allocate vector of size 147.6 Mb
.
我该如何诊断?
这是我的代码:
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')
在第一个打印语句之后执行停止。我不明白额外的内存使用量来自哪里。环顾 R 中关于 memory() 的文档,这似乎是一个连续的内存问题?有没有办法在 Ubuntu 上的 R 中解决这个问题?
还查看了其他人在这里提出类似问题,但提出的解决方案是特定于 Windows 的。
编辑 1
一些评论以解决以下评论:
> 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
因此,从 CSV 读取对象的大小看起来并没有太大变化。我会检查 data.table() 和其余的......
编辑 2
我已经更新了我的代码以使用 data.table() 并且有同样的错误。这让我担心它可能对我的机器有些特殊?对于所涉及文件的大小,这似乎很奇怪。 Error: cannot allocate vector of size 147.6 Mb
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')
编辑 3
通过我的数据检查,我怀疑问题可能在这里。Set3.csv 中有一些常见的字段名称,所以我认为它正在做讨厌的 nxn 连接或其他东西。