如何释放崩溃的 R 会话的 big.matrix 个对象使用的内存
How to free memory which is used by big.matrix objects of crashed R sessions
我使用 bigmemory 包来并行访问大矩阵对象,例如像这样
a <- bigmemory::big.matrix(nrow = 200, ncol = 100, shared = TRUE) # shared = TRUE is the default
但是,使用生成的对象有时会导致 R 崩溃。这意味着矩阵对象使用的内存没有被释放。 bigmemory manual 警告这种情况但没有提供解决方案:
Abruptly closed R (using e.g. task manager) will not have a chance to
finalize the big.matrix objects, which will result in a memory leak, as
the big.matrices will remain in the memory (perhaps under obfuscated names)
with no easy way to reconnect R to them
我的 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 在不同的操作系统上将它的对象存储在哪里?如何删除孤立的对象?
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
我不知道其他 OS 是怎么做到的,如果您知道,请随时将其添加到此社区 Wiki
我使用 bigmemory 包来并行访问大矩阵对象,例如像这样
a <- bigmemory::big.matrix(nrow = 200, ncol = 100, shared = TRUE) # shared = TRUE is the default
但是,使用生成的对象有时会导致 R 崩溃。这意味着矩阵对象使用的内存没有被释放。 bigmemory manual 警告这种情况但没有提供解决方案:
Abruptly closed R (using e.g. task manager) will not have a chance to finalize the big.matrix objects, which will result in a memory leak, as the big.matrices will remain in the memory (perhaps under obfuscated names) with no easy way to reconnect R to them
我的 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 在不同的操作系统上将它的对象存储在哪里?如何删除孤立的对象?
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
我不知道其他 OS 是怎么做到的,如果您知道,请随时将其添加到此社区 Wiki