3

根据我收到的错误消息,我有 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 连接或其他东西。

4

2 回答 2

0

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

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

这个故事的寓意是,R 函数使用的内存比传入向量本身的大小要多得多,正如上面@Justin 所建议的那样,用object.size. 对于在处理操作期间用完 RAM 的函数也是如此。

于 2012-04-16T18:45:28.130 回答
0

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

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

于 2016-02-13T20:22:57.797 回答