numpy.memmap возвращает недостаточно памяти, в то время как доступно много
Во время типичного звонка numpy.memmap()
на машине с 64-битным Windows Python вызывает следующую ошибку:
OSError: [WinError 8] Not enough memory resources are available to process this command
Другой компьютер с Windows выдает ту же ошибку с другим текстом:
OSError: [WinError 8] Not enough storage is available to process this command.
Вот абстрактный код:
with open(infile, 'rb') as f:
......
array = numpy.memmap(f, dtype='uint8', mode='r', offset=offset, shape=arraysize).tolist()
К этому времени Python использовал только 50 МБ памяти. Что может быть причиной нехватки памяти?
3 ответа
Оказывается, проблема в том, что offset
+ shape
в вызове memmap больше, чем общий размер файла (т.е. я пытаюсь прочитать размер файла больше).
Сообщение об ошибке о ресурсе памяти в этом случае немного вводит в заблуждение.
Для тех, кто попал сюда и потратил много времени, пытаясь понять эту ошибку в Windows, вот правильный отчет об ошибке в Linux:
% complete: 0%| | 0/20000 [00:00<?, ?it/s] setting up memory map: shape: (20000, 512, 512)
Traceback (most recent call last):
File "bmi_command_line.py", line 146, in <module>
bmi.run_BMI()
File "/home/cat/code/bmi/bmi/bmi.py", line 585, in run_BMI
self.bmi_update()
File "/home/cat/code/bmi/bmi/bmi.py", line 661, in bmi_update
self.compute_frame_number()
File "/home/cat/code/bmi/bmi/bmi.py", line 790, in compute_frame_number
self.newfp = np.memmap(self.fname_fluorescence,
File "/home/cat/anaconda3/envs/bmi/lib/python3.8/site-packages/numpy/core/memmap.py", line 267, in __new__
mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
ValueError: mmap length is greater than file size
Я столкнулся с той же ошибкой при попытке сопоставить + байты в файле, когда его размер былsize
<offset
+length
.
Проблема была в режиме. Если вы хотите отобразить сегмент файла, чтобы прочитать его содержимое, чтобыACCESS_READ
вы должны выбрать диапазон в пределах размера файла, иначе вы получите ошибку. Но если вы собираетесь что-то записывать в пространство вне файла, вы должны установитьaccess
пометитьACCESS_WRITE
.
import mmap
import io
FILE_NAME = 'file.dat'
with io.open(FILE_NAME, "wb+") as f:
# set file size
f.truncate(50)
# map space within the file
# >> Success, the file size is same
mmap.mmap(f.fileno(), length=25, access=mmap.ACCESS_READ)
# map space out of the file with READ flag
# >> OSError: [WinError 8] Not enough memory resources are available to process this command
mmap.mmap(f.fileno(),length=100,access=mmap.ACCESS_READ)
# map space out of the file with WRITE flag
# >> Success, the file size was changed from 50 to 100 bytes
mmap.mmap(f.fileno(),length=100,access=mmap.ACCESS_WRITE)