内存使用率高,但 CPU 使用率低?

内存使用率高,但 CPU 使用率低?

我正在尝试使用 R 合并大型数据帧。我的计算机 CPU 是 3GHz 英特尔酷睿 i5 四核处理器,配备 8GB RAM。我正在使用 Reduce 函数,而不是使用循环。所有数据帧都在一个列表中,总大小为 160MB。

<- Reduce(function(x,y) merge(x, y, all = TRUE, by = my_column_ID), my_list)

在运行脚本之前,我使用终端将虚拟内存扩展至 50GB,如下所述。

cd ~
touch .Renviron
open .Renviron

R_MAX_VSIZE=50Gb

https://r.789695.n4.nabble.com/R-3-5-0-vector-memory-exhausted-error-on-readBin-td4750237.html

在运行脚本清理 RAM 之前,计算机也重新启动了,并且关闭了所有其他程序,只有 RStudio 正在运行。

该脚本已经运行了几个小时,所以我决定检查 Mac 上的活动监视器。

CPU 使用率非常低 (内核 2.3% 和 rsession 0.5%),但是内存使用率非常高 (内核 30MB、r session 36GB 和 rstudio 200MB)。

这怎么解释呢?内存运行良好,信息可以快速访问,为什么 CPU 却运行不快呢?

答案1

您的机器有 8GB 的​​ RAM,但您的程序使用了 36GB。这意味着它将使用交换空间。

使用那么多交换并不意味着你的程序会很高效。为了读取一部分内存,它必须将另一部分推送到磁盘。

您的程序几乎不占用 CPU 时间的原因是,它花费 99% 的运行时间等待内存块被分页进出磁盘。

您的程序需要的内存至少是系统实际内存的四倍。如果您确实想利用系统,则需要安装更多 RAM,或在具有更多 RAM 的系统上运行您的程序。

SSD 可能比 HDD 更好,但即使是这种负载也无法在其上顺利运行。

答案2

您可能正在合并一对多,这可能会导致不必要的内存使用。我会这样做来排除故障:

  1. 仅合并 Reduce 函数之外的两个 DF:merge(x, y, all = TRUE, by = my_column_ID)

  2. 合并 x 和/或 y 的子集。例如 x.small <- x[1:100,];merge(x.small, y, all = TRUE, by = my_column_ID)。对 y 执行相同操作。

检查结果是否符合您的预期。通常,您有重复的键(参数by),这会占用大量内存。这个问题通常可以通过删除重复数据来解决。

当然,这一切都取决于您的数据......如果您可以分享一些数据(例如,dput(head(x))和dput(head(y)),那么我们就可以更好地排除故障。

相关内容