r - 如何释放崩溃 R 会话的 big.matrix 对象使用的内存
问题描述
我使用bigmemory包并行访问大矩阵对象,例如像这样
a <- bigmemory::big.matrix(nrow = 200, ncol = 100, shared = TRUE) # shared = TRUE is the default
但是,使用生成的对象有时会导致 R 崩溃。这意味着矩阵对象使用的内存没有被释放。bigmemory手册警告这种情况,但没有提出解决方案:
突然关闭的 R(使用例如任务管理器)将没有机会最终确定 big.matrix 对象,这将导致内存泄漏,因为 big.matrix 将保留在内存中(可能以混淆的名称)而没有简单的方法将 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在不同操作系统上将其对象存储在哪里,如何删除孤立对象?
解决方案
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
推荐阅读
- angular - TypeError:无法使用 InvalidPipeArgument 读取 null 的属性“名称”:管道“AsyncPipe”的“[object Object]”
- python - XLSX 仅写入数组中的最后一个索引
- php - 将 json 文件转换为 php 数组以从数组中选择随机名称
- ios - 将砌体 x/y 约束设置为视图宽度/高度的百分比
- autolisp - 是否可以使用 Autolisp 将查找参数推送到多个块定义中
- amazon-web-services - Elixir:ExAws:DynamoDB:查询过滤器
- android - Android中线性布局中的按钮右对齐,按钮并排
- rxjs - 工作期间缺少Angular vesion 7核心模块
- css-float - 为什么 CSS Float 不会将我的文本移动到图像的右侧
- spring-cloud - 为什么我的 Spring Cloud 函数试图打开本地 HTTP 连接?