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-битной целью. Игнорируйте это и оставьте комментарий, удалит этот ответ.