【发布时间】:2019-02-04 16:22:27
【问题描述】:
我收到的信息是:
cannot allocate vector of size 215.2 Mb
215.2 对我来说似乎并不大,尤其是当我看到的示例位于 10 Gb 的平流层时。
以下是我想要完成的:
Combined<-merge(x=SubjectsYOY,y=o2017,by="subjectkey",all.x=TRUE)
这是一个非常基本的左连接。
SubjectsYOY 有 16 列的 28,202,411 条记录。 o2017 有 109,850 条记录,共 94 列。
在完成此操作后,我还需要再进行 3 次非常相似的合并。
我试图通过将对象保存到我机器上的 .rda 文件,关闭 R,然后加载 .rda 来大大减少内存负载 - 第一件事。显然没有奏效。此外,尽量避免删除列 - 在处理这么多记录时,也许有一个更宽容的命令而不是合并?
另外,提前按主题键对两个数据帧的大小进行排序会有所帮助吗?
在我尝试完成此操作时,我有五个数据帧加载到我的内存中。下面是一些关于我的计算机发生了什么的 sessionInfo:
sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.3 plyr_1.8.4 tools_3.4.3 yaml_2.2.0 Rcpp_0.12.17
尾部内容如下:
所以我做了一些实验并查看了 memory.limit。
memory.limit()
自动设置为 32676。
现在我将其更改为:
memory.limit(326760+10000)
我的第一个大合并成功了!
现在我还有 3 个合并要进行。下一个是 o2018,它再次有 94 个独特的和新的列,需要添加到之前创建的内容中:16 + 94 和现在 + 94 列。太多了!
所以我在对内存管理了解不多的情况下再次尝试更改内存限制:
memory.limit(32676000+10000)
现在请注意那里的两个额外的零。但现在我又得到了同样的原始错误。
有人认为将这些多个合并合并为一个会有所帮助吗?代码是什么?这是最好的代码还是我应该尝试模拟 SQL 运行或其他什么?不管这需要发生什么。
再次感谢您!
【问题讨论】:
-
您能否提供一些关于您的数据的见解?一个最小可重复的例子总是非常有帮助的。
-
这里有大量的列要复制。为了您和社区的其他人,关于如何做的任何建议?它是字符串字段、整数和一些浮点数的广泛组合。谢谢。
-
尝试将 R 更新到最新版本 3.5.1?另外,您是否尝试过使用每个表中的子集(比如 100 行)进行操作?
-
如果操作成功了一个子集,那么这意味着它不是语法或类型匹配问题,而只是内存问题。您可以尝试使用
data.table进行连接,这可能会提高内存效率(不过我不确定)。否则,您可能需要启动 AWS EC2 实例或具有更多 RAM 的东西。您也可以运行gc()来释放未使用的内存。 -
另外,你的两个对象在内存中有多大?是否有可能您已经在加载这两个文件时就已经用尽了 RAM?