r - 使用大内存在 R 中处理大于物理 RAM 的数据?

标签 r memory-management memory-mapping r-bigmemory bigdata

我正在开发一个名为 biglasso 的 R 包通过使用 bigmemory C++ library 中实现的内存映射技术,适合 R 中针对海量数据集的套索模型。具体来说,对于非常大的数据集(例如 10GB),首先使用存储在磁盘上的内存映射文件创建文件支持的 big.matrix。然后模型拟合算法通过MatrixAccessor访问big.matrix在C++库中定义,用于获取计算数据。我假设内存映射技术允许处理大于可用 RAM 的数据,如 the bigmemory paper 中所述。 。

对于我的包来说,如果数据大小不超过可用 RAM,此时一切都运行良好。然而,当数据大于 RAM 时,代码会永远运行,没有提示,没有错误,没有停止。在 Mac 上,我检查了 top 命令,发现该作业的状态不断在“ sleep ”和“运行”之间切换,我不确定这意味着什么,或者这表明发生了什么事。

[编辑:]

“无法完成”、“永远运行”,我的意思是:使用 16 GB RAM 处理 18 GB 数据无法完成超过 1.5 小时,但可以在 5 分钟内完成如果有 32 GB RAM。

[编辑结束]

问题:

(1) 我基本上了解内存映射利用虚拟内存,以便它可以处理大于 RAM 的数据。但是处理大于 RAM 的对象需要多少内存呢?有上限吗?还是由虚拟内存的大小决定?由于虚拟内存是无限的(受硬盘驱动器限制),这是否意味着内存映射方法可以处理比物理 RAM 大得多的数据?

(2) 有没有办法可以分别测量物理 RAM 和虚拟内存的使用情况?

(3) 我做错了什么吗?我的问题的可能原因是什么?

非常感谢任何反馈!提前致谢。


以下是我在 Mac 和 Windows 上进行的实验的一些详细信息以及相关问题。

  1. 在 Mac 操作系统上:物理 RAM:16GB;测试数据:18GB。这是内存使用情况的屏幕截图。代码无法完成。

enter image description here

[编辑2]

enter image description here

我在此处附加了 CPU 使用情况和历史记录。仅使用一个核心进行 R 计算。奇怪的是,系统使用了 6% 的 CPU,而用户只使用了 3%。而且从CPU历史窗口来看,有很多红色区域。

问题:这表明什么?现在我怀疑是CPU缓存被占满了。是对的吗?如果是这样,我该如何解决这个问题?

[编辑结束 2]

问题:

(4) 据我了解,“内存”列显示物理 RAM 中使用的内存,而“实际内存”列显示总内存使用量,如 here 所指出的那样。 。那是对的吗?使用的内存总是显示~2GB,所以我不明白为什么RAM中这么多内存没有被使用。

(5) 一个小问题。据我观察,似乎“使用的内存”+“缓存”必须始终小于“物理内存”(位于底部中间部分)。这是正确的吗?


  • 在 Windows 计算机上:物理 RAM:8GB;测试数据:9GB。我观察到,随着我的工作开始,内存使用量不断增加,直到达到极限。工作也无法完成。 我还测试了biganalytics中的功能包(也使用bigmemory),发现内存也炸了。
  • enter image description here

    最佳答案

    “无法完成”在这里含糊不清。如果您等待足够长的时间,您的计算可能会完成。当您使用虚拟内存时,您可以将其分页到磁盘上或从磁盘上分页,这比将其保存在 RAM 中慢数千到数百万倍。您将看到的速度减慢取决于您的算法访问内存的方式。如果您的算法仅以固定顺序访问每个页面一次,则可能不会花费太长时间。如果你的算法在你的数据结构周围跳跃 O(n^2) 次,分页将会减慢你的速度,以至于完成起来可能不切实际。

    关于r - 使用大内存在 R 中处理大于物理 RAM 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951530/

    相关文章:

    大数据集的 Python 内存错误

    c++ - "live C++ objects that live in memory mapped files"?

    在 Cortex-M3 上使用带有预制地址的位带宏时出现问题

    r - "get_int_parms"不适用于包 "glmnet"的 .Fortran()

    r - 不推荐在 tibble 上设置行名称。错误 : invalid 'row.names' length

    c - 从二进制文件读取具有动态分配变量的结构

    c++ - 在内存映射文件时写入内存映射文件

    r - 将 csv 值转换为 R 中的表

    r - 将 Jupyter Notebook 转换为 R studio 脚本

    c - 在 C 中释放结构的函数