如何释放崩溃 R 会话的 big.matrix 对象使用的内存

Posted

技术标签:

【中文标题】如何释放崩溃 R 会话的 big.matrix 对象使用的内存【英文标题】:How to free memory which is used by big.matrix objects of crashed R sessions 【发布时间】:2019-04-26 11:45:42 【问题描述】:

我使用bigmemory 包来并行访问大矩阵对象,例如像这样

a <- bigmemory::big.matrix(nrow = 200, ncol = 100, shared = TRUE) # shared = TRUE is the default

但是,使用生成的对象有时会导致 R 崩溃。这意味着矩阵对象使用的内存没有被释放。 bigmemory manual 警告这种情况,但没有提供解决方案:

突然关闭的 R(使用例如任务管理器)将没有机会 完成 big.matrix 对象,这将导致内存泄漏,如 big.matrices 将保留在内存中(可能在混淆的名称下) 没有简单的方法将 R 重新连接到它们

在我的 R 进程几次崩溃和重新启动后,我收到以下错误:

No space left on device 
Error in CreateSharedMatrix(as.double(nrow),
as.double(ncol), as.character(colnames),  : 
  The shared matrix could not be created

显然,我的记忆被孤立的大矩阵阻塞了。我尝试了命令ipcs,它被宣传为列出共享内存块,但是与我的矩阵对象相比,列出的段的大小太小了。这也意味着 ipcrm 在这里删除我的孤立对象是没有用的。

bigmemory 在不同的操作系统上将其对象存储在哪里?如何删除孤立的对象?

【问题讨论】:

我想我们在this issue讨论过类似的问题。 【参考方案1】:

Linux

致电df -h 解决了我的操作系统(Linux/CentOS)的谜团。

$ df -h

Filesystem       Size  Used Avail Use% Mounted on
... 
tmpfs           1008G 1008G     0 100% /dev/shm
...

文件夹/dev/shm 中有一个临时文件系统。其中的文件仅存在于 RAM 中。该文件系统用于在进程之间共享数据。在这个文件夹中,有几个文件名是随机字符串,还有多个文件前缀相同,似乎与同一个big.matrix对象有关:

$ ls -l /dev/shm

-rw-r--r-- 1 user  grp 320000 Apr 26 13:42 gBDEDtvwNegvocUQpYNRMRWP
-rw-r--r-- 1 user  grp      8 Apr 26 13:42 gBDEDtvwNegvocUQpYNRMRWP_counter
-rw-r--r-- 1 user  grp     32 Apr 26 13:42 sem.gBDEDtvwNegvocUQpYNRMRWP_bigmemory_counter_mutex

不幸的是,我不知道哪个矩阵属于哪个文件,但是如果您当时没有运行 R 进程,则删除具有此名称模式的文件应该会删除孤立对象。

窗口

我不知道其他操作系统是如何做到这一点的,所以如果您知道,请随时将其添加到这个社区 wiki 中

【讨论】:

以上是关于如何释放崩溃 R 会话的 big.matrix 对象使用的内存的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中计算 big.matrix 的行总和?

R中几个big.matrix对象的元素平均值

R bigmemory attach.big.matrix 对于非常宽的矩阵来说非常慢

计算 R 中 big.matrix 的对角线

如何转置 big.matrix 对象?

等效于 R 中 big.matrix 的 row() 和 col()