【发布时间】:2015-12-01 15:14:06
【问题描述】:
我有一个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
硬盘的大小只有 250G。尽管如此,它还是能以某种方式在/tmp 中生成10T 的大文件,并且对应的数组似乎仍然可以访问。脚本的输出如下:
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)
所以,问题来了:一开始如何检查,如果真的有足够的内存来存储数据,然后确实为整个数组保留空间?
【问题讨论】:
标签: python linux numpy memory-mapped-files sparse-file