首页 > 解决方案 > 在 r 中合并两个大型数据集时的内存分配问题

问题描述

我需要将两个相对较大的数据集合并到R. A651,052 个观察值和 118 个变量B包含38,208 个观察值和 41 个变量,从字面上看,我无法进一步减小数据量。应用object.size()函数显示,这两个数据集分别占用了610 Mb 和 13 Mb的内存。

我使用的机器有一个 64 位 CPU 和 32GB 内存。然而,当尝试合并这些文件时,会R出现内存分配错误:Error: cannot allocate vector of size x Mb!我检查了关于 SO 的类似帖子并尝试了许多建议的解决方案,但在我的情况下它们都没有效果:我检查了内存限制,使用memory.limit()which 返回32684表明 R 可以访问我计算机上的最大可用内存。此外,使用包中的merge函数data.table也无法解决问题,并产生内存分配错误。

我能够分成两部分并按照打击程序分别A合并(实际上是 a left_join)每个部分:B

# open fresh R session

load(A)
load(B)

part_1 <- left_join(first_half_A, B)
save(part_1)

# close R
# re-open R

load(A)
load(B)

part_2 <- left_join(second_half_A, B)
save(part_2)

# close R

生成的部分在磁盘上占据了周围200 Mb,但是当我将它们加载到磁盘中时,R它们的大小会急剧增加并且几乎占据25 Gb,这与我希望以R这种方式重新加载时使这些部分具有更易于管理的大小相反,这使我无法同时拥有它们已加载,因此我可以使用bind_rows.

考虑到添加额外的 RAM 或使用 AWS 等平台不是一种选择,您有什么建议来克服这个问题?一个最好不要进入SQL世界的解决方案是非常受欢迎的。

PS。下面你可以看到sessionInfo()我机器上的输出:

> sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 16299)

Matrix products: default

locale:
[1] LC_COLLATE=English_Netherlands.1252  LC_CTYPE=English_Netherlands.1252    LC_MONETARY=English_Netherlands.1252 LC_NUMERIC=C                        
[5] LC_TIME=English_Netherlands.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

loaded via a namespace (and not attached):
[1] compiler_3.6.2 tools_3.6.2    knitr_1.28     xfun_0.12  

第一次更新

帮助我完成合并的原因是在可能的情况下更改了一些变量的类型,主要是numeric为了integer进一步减少数据大小。然而,内存分配问题仍然存在,因为合并的数据集包含 47M 行和 124 个变量,而在新的 R 会话中加载时,磁盘上仅占用 235 Mb 占用了整个 32 Gb 的 RAM,并且没有更多空间用于即将进行的计算量也很大的分析,例如估计多个混合模型。我将非常感谢有关这种情况的任何建议,这将有助于我继续进行。

标签: rmemory-managementmergeout-of-memorylarge-data

解决方案


推荐阅读