我使用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 在哪里将其对象存储在不同的操作系统上,以及如何删除孤立的对象?
答案 0 :(得分:1)
调用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中