我正在开发一个名为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上的实验以及相关问题的一些细节。
[编辑2]
我在这里附加了CPU使用情况和历史记录。 R计算只使用一个核心。奇怪的是,系统使用6%的CPU,而用户只使用3%。从CPU历史窗口,有很多红色区域。
问题:这表明了什么?现在我怀疑它是CPU缓存填满了。是对的吗?如果是这样,我该如何解决这个问题?
[结束编辑2]
问题:
(4)据我所知,“memory”列显示物理RAM中使用的内存,而“real memory”列显示总内存使用情况,如here所示。那是对的吗?使用的内存总是显示~2GB,所以我不明白为什么RAM中的内存不会被使用。
(5)一个小问题。正如我所观察到的,似乎“使用的内存”+“缓存”必须始终小于“物理内存”(位于底部中间部分)。这是对的吗?
答案 0 :(得分:2)
“无法完成”在这里含糊不清。如果你等了足够长的话,你的计算可能会完成。使用虚拟内存时,可以在磁盘上打开和关闭磁盘,这比将其保存在RAM中慢几千到几百万倍。您将看到的减速取决于您的算法如何访问内存。如果您的算法仅以固定顺序访问每个页面一次,则可能不会花费太长时间。如果你的算法在你的数据结构周围跳跃O(n ^ 2)次,那么分页会让你慢下来,这可能是不切实际的。
答案 1 :(得分:2)
在Windows中,签出TaskManager可能很有用 - >性能 - > Resourcemonitor - >磁盘活动,以查看进程ID向磁盘写入的数据量。如果写入速度变得瓶颈等,它可以从RAM中了解虚拟内存的数据量