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

时间:2019-04-26 11:45:42

标签: r shared-memory r-bigmemory

我使用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 在哪里将其对象存储在不同的操作系统上,以及如何删除孤立的对象?

1 个答案:

答案 0 :(得分: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进程,那么删除具有该名称模式的文件应该会删除孤立的对象。

Windows

我不知道其他操作系统是如何做到的,因此,如果您知道的话,可以随时将其添加到此社区Wiki中