使用bigmemory处理R中大于物理RAM的数据?

时间:2016-03-11 23:08:40

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

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

对于我的软件包,如果数据大小不超过可用RAM,则此时一切都很好。但是,当数据大于RAM,没有抱怨,没有错误,没有停止时,代码会永远运行。在Mac上,我检查了top命令,并注意到这个作业的状态在“休眠”和“正在运行”之间保持切换,我不确定这意味着什么,或者这表明发生了什么。

[编辑:]

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

[结束编辑]

问题:

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

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

(3)我做错了什么吗?我在这里遇到问题的可能原因是什么?

真的很感激任何反馈!提前致谢。

以下是我在Mac和Windows上的实验以及相关问题的一些细节。

  1. 在Mac OS上:物理内存:16GB;测试数据:18GB。以下是内存使用情况的屏幕截图。代码无法完成。
  2. enter image description here

    [编辑2]

    enter image description here

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

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

    [结束编辑2]

    问题:

    (4)据我所知,“memory”列显示物理RAM中使用的内存,而“real memory”列显示总内存使用情况,如here所示。那是对的吗?使用的内存总是显示~2GB,所以我不明白为什么RAM中的内存不会被使用。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

在Windows中,签出TaskManager可能很有用 - >性能 - > Resourcemonitor - >磁盘活动,以查看进程ID向磁盘写入的数据量。如果写入速度变得瓶颈等,它可以从RAM中了解虚拟内存的数据量