numpy memmap ошибка времени выполнения.... 64-битная система с лимитом 2Gigas?

Я пытаюсь создать большой файл с NumPy Memmap

big_file = np.memmap(fnamemm, dtype=np.float32, mode='w+', shape=(np.prod(dims[1:]), len_im), order='F')

Система Windows 10-64bit работает в 64-битном питоне

In [2]: sys.maxsize

Out[2]: 9223372036854775807

С достаточным количеством виртуальной памяти (максимум 120000 Мегапикселей)

Однако каждый раз, когда я пытаюсь создать файл, размер которого должен превышать 2 гига, я получаю ошибку во время выполнения

In [29]: big_file = np.memmap(fnamemm, dtype=np.int16, mode='w+', shape=(np.prod(dims[1:]), len_im), order=order)
C:\Users\nuria\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site-packages\numpy\core\memmap.py:247: RuntimeWarning: overflow encountered in long_scalars
  bytes = long(offset + size*_dbytes)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-29-66578da2d3f6> in <module>()
----> 1 big_file = np.memmap(fnamemm, dtype=np.int16, mode='w+', shape=(np.prod(dims[1:]), len_im), order=order)

~\AppData\Local\Continuum\anaconda3\envs\caiman\lib\site-packages\numpy\core\memmap.py in __new__(subtype, filename, dtype, mode, offset, shape, order)
    248
    249         if mode == 'w+' or (mode == 'r+' and flen < bytes):
--> 250             fid.seek(bytes - 1, 0)
    251             fid.write(b'\0')
    252             fid.flush()

OSError: [Errno 22] Invalid argument

Эта ошибка не возникает, когда размеры файлов ниже 2 Гигабайт...

Я повторил ту же проблему с другим Windows 7 также 64bit

Я что-то забыл? Почему memmap действует как 32-битная система?

РЕДАКТИРОВАТЬ: ошибка не совсем ошибка во время выполнения. переменная "bytes" получает предупреждение во время выполнения при попытке получить длину файла, в результате чего, я полагаю, получился неверный аргумент, вызывающий ошибку Errno 22

1 ответ

У меня была похожая ошибка, и оказалось, что это потому, что один из аргументов shape=(A,B) был с int32 вместо int64. Попробуйте следующее:

len_im64 = np.array(len_im,dtype='int64')
big_file = np.memmap(fnamemm, dtype=np.float32, mode='w+', shape=(np.prod(dims[1:]).astype('int64'), len_im), order='F')

Это исправило это для меня.

Даже если система 64-битная, проблема может быть в том, что приложение построено с 32-битной целью. Проверьте режим выполнения вашей оболочки (32-битный или 64-битный).

Для таких приложений вы должны сделать их большой адрес осведомленным. Затем 32 приложения могут получить доступ к 4 ГБ памяти на 64-битных компьютерах.

Как это сделать? Вот чья-то статья.

https://github.com/pyinstaller/pyinstaller/issues/1288

Примечание: если ваше приложение уже построено с 64-битной целью. Игнорируйте это и оставьте комментарий, удалит этот ответ.

Другие вопросы по тегам