我已经看到了几个与此相关的问题,但没有一个直接解决这个问题(here,here,尤其是here,但这是在使用AWS实例的情况下)。我有R版本3.6.1(2019-07-05)在带有16GB RAM的Ubuntu 18.04.2 LTS下运行。我有一个带有64位处理器的64位R版本。
问题:
我有一个Rnw
文件,它处理一些大数据集。在Rnw
文件的一半中,我已经使用pryr::mem_used()
消耗了约10GB的RAM,在来自终端的htop
中,我可以看到R会话消耗了约13GB的RAM,接近于RAM的物理限制。此时,我删除了R会话中的大多数无用对象,并使用pryr::mem_used()
将R中的RAM降低到仅1.1GB。但是,在htop
中,R仍然消耗约13GB的RAM。
例如,当删除所有相关对象时,这是R中的内存输出
> pryr::mem_used()
# 1.1 GB
> gc()
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 3174843 169.6 5933545 316.9 5933545 316.9
# Vcells 115029589 877.7 933231149 7120.0 1616091482 12329.8
htop
的图片是:
它显示RAM消耗最高为13GB,然后显示R会话消耗约12.5GB
制作一个reprex
有点困难,因为我不能在一个小例子中重现该问题,但我对问题的处理有些深。此时(R中有2GB RAM,而htop
中有13GB RAM),我运行gc()
无济于事。我通过创建新对象进行了一些测试,一切都很好。但是,如果我运行 any 函数调用system
或system2
,则会收到一条错误消息,指出R无法分配更多的内存。
我很困惑,为什么htop
仍然报告R占用了所有RAM,即使pryr::mem_used()
仅报告了2GB的RAM。答案here讨论了创建第二个R会话以及它如何消耗内存的问题,但是我仍然首先无法理解为什么R报告的内存比htop
低得多。
这是我的会话信息的第一部分,用于确认R版本,操作系统等。
R version 3.6.1 (2019-07-05)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C LC_TIME=en_GB.UTF-8
[4] LC_COLLATE=en_GB.UTF-8 LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
[7] LC_PAPER=en_GB.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] parallel stats graphics grDevices datasets utils methods base