情况:修复Out of Memory
Ubuntu的Matlab中的错误
目标:在外部HDD / SSD上分配一些虚拟内存和/或交换;读/写从20 GBps减少到0.1 GBps,没关系!
术语:此处交换和虚拟内存
不,交换和虚拟内存完全不同。例如,映射1GB文件的内存使用了额外的1GB虚拟内存,但是交换的使用没有变化。交换是后备存储的一种形式。虚拟内存的许多用途与后备存储无关。(并且曾经有没有虚拟内存且没有交换的系统以及有交换但没有虚拟内存的系统。)
消费类硬件有限,因此我需要使用更多的虚拟内存和/或与外部HDD交换。Matlab关于交换内存(TODO不包括虚拟内存?)
Linux系统—使用
mkswap
和swapon
命令更改交换空间。
系统特点
你可以看到你有多少
swapon -s
Filename Type Size Used Priority /dev/sda3 partition 8326140 0 -1
Matlab的配置
% /programming//a/35971040/54964 com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB % TODO cannot find ways how to put Matlab use /dev/sda3
因此,您看到我的Matlab没有使用它。我
Out of Memory
在Matlab中收到大型矩阵的错误。在将reshape
矩阵矩阵转换为向量并编写并行代码方面,我一直没有成功。所以我想使用虚拟内存,因为我需要完成工作。速率无关紧要。
伪码
- 用于创建交换,启动MATLAB并在MATLAB退出时删除交换的Shell脚本。(MichaelHooreman)
- 在外部硬盘上启用交换。如何在
sudo swapon -a
这里使用? - 启动Matlab。
- 把Matlab使用掉。
- Matlab退出时删除交换。
Micheal脚本中的临时交换,运行客户端以及关闭/删除交换
情况:无法控制设置环境(1),运行Matlab(2)和关闭环境(3)
脚本中的错误
#!/usr/bin/env bash
# /programming//a/69808/54964
set -e
# TODO How to do swapoff if any error?
SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"
dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}
具有Transcend 25M3 1 TB的迭代1,在文件系统很少使用的情况下 ext4
启动脚本后的日志
sh start_matlab_with_swap.sh 16000+0 records in 16000+0 records out 16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes) no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9 [sudo] password for masi: swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016 swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested. swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000 Swap enabled. Press enter to continue start_matlab_with_swap.sh: 11: read: arg count
运行客户端
命令历史记录在交换存储器的Matlab的第一个起始位置(票号#02075943)中,出现错误读取命令历史记录--时出现问题。只需重新启动Matlab,如果您使用默认设置即可解决问题。命令
prefdir
给出的/home/masi/.matlab/R2016a
是默认位置(/home/{username}/.matlab/R2016a
。/home/masi/.matlab/R2016a/matlab.prf
重新启动后文件存在,此处。... [其他错误] ...
关闭Matlab并在终端中再次输入密码
[sudo] password for masi: swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016 [ bugs here! ]
开放:如何在此处应用更好的错误捕获错误处理?请参阅我的脚本以获取源代码中的示例。线程如果发生错误/警告,如何进行错误捕获和交换?
永久交换=与运行客户端分开的交换设置
设置交换
# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile
masi@masi:~$ sudo mkswap /mnt/.swapfile
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72
masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.
masi@masi:~$ sudo chmod 600 /mnt/.swapfile
masi@masi:~$ free -m
total used free shared buff/cache available
Mem: 7925 1494 175 196 6255 5892
Swap: 28610 0 28610
/etc/fstab
在永久更改的末尾添加以下内容
# /unix//a/298212/16920
# /unix//a/298543/16920
# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile none swap defaults,discard 0 0
# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile none swap sw 0 0
系统:Linux Ubuntu 16.04 64位
Linux内核:4.6
Linux内核选项:wl
Matlab:2016a
官方Matlab文档:解决“内存不足”错误
外部硬盘驱动器:Transcend 1 TB StoreJet 25M3 评估,Transcend 2 TB StoreJet 25M3
外部HDD文件系统:ext4
外部HDD缓冲区:8 MB
相关线程:如何增加Ubuntu中的MATLAB内存限制?(如何使用MATLAB的mkswap,swapon?),如何减少Matlab中的物理内存增加?,如何解决Matlab中的内存不足错误?,如何修复Matlab中10800x10800矩阵的内存不足错误?,如何在Matlab r2012b中增加内存限制(连续的和整体的)?,如何在Matlab 2009b中增加阵列块并解决内存不足错误?,如何解决Matlab中一个小变量的内存不足问题?,在Matlab中为“内存不足”。一个缓慢但永久的解决方案?