我有一个使用数组python3
操作的脚本。numpy.memmap
它将一个数组写入新生成的临时文件,该文件位于/tmp
:
import numpy, tempfile
size = 2 ** 37 * 10
tmp = tempfile.NamedTemporaryFile('w+')
array = numpy.memmap(tmp.name, dtype = 'i8', mode = 'w+', shape = size)
array[0] = 666
array[size-1] = 777
del array
array2 = numpy.memmap(tmp.name, dtype = 'i8', mode = 'r+', shape = size)
print('File: {}. Array size: {}. First cell value: {}. Last cell value: {}'.\
format(tmp.name, len(array2), array2[0], array2[size-1]))
while True:
pass
HDD的大小只有250G。尽管如此,它还是能以某种方式生成 10T 的大文件/tmp
,并且相应的数组似乎仍然可以访问。脚本的输出如下:
File: /tmp/tmptjfwy8nr. Array size: 1374389534720. First cell value: 666. Last cell value: 777
该文件确实存在并且显示为 10T 大:
$ ls -l /tmp/tmptjfwy8nr
-rw------- 1 user user 10995116277760 Dec 1 15:50 /tmp/tmptjfwy8nr
但是,整个大小/tmp
要小得多:
$ df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 235G 5.3G 218G 3% /
该进程也是假装使用10T虚拟内存,这也是不可能的。命令的输出top
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31622 user 20 0 10.000t 16592 4600 R 100.0 0.0 0:45.63 python3
据我了解,这意味着在调用numpy.memmap
整个数组所需的内存期间未分配,因此显示的文件大小是虚假的。这反过来意味着当我开始逐渐用我的数据填充整个数组时,在某些时候我的程序会崩溃或者我的数据会被破坏。
事实上,如果我在我的代码中引入以下内容:
for i in range(size):
array[i] = i
一段时间后我收到错误消息:
Bus error (core dumped)
因此,问题是:如何在开始时检查是否真的有足够的内存来存储数据,然后确实为整个数组保留空间?