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)
Другие вопросы по тегам