import numpy as np
N = 12500
x = np.random.randint(100, size=(N,N)) # int32
x = x.astype('int16', copy=False)
throws
numpy.core._exceptions.MemoryError: Невозможно выделить массив с формой (12500, 12500) и типом данных int16
Для некоторыхпричина np.random.randint(100, size=(N,N),dtype='int16')
работает. Проблема в том, что мне нужно загрузить сжатый файл npz (который я представляю здесь как случайный nparray), а затем преобразовать из int32 в int16.
Я использовал memory_profiler, чтобы проверить его, запустив python -m memory_profiler ./testProc.py
import numpy as np
@profile
def test_size(N=12500):
x = np.random.randint(100, size=(N,N))
x = x.astype('int16', copy=False)
del(x)
if __name__ == '__main__':
test_size()
с
Line # Mem usage Increment Line Contents
================================================
2 24.648 MiB 24.648 MiB @profile
3 def test_size(N=2500*5):
4 620.781 MiB 596.133 MiB x = np.random.randint(100, size=(N,N))
5 620.789 MiB 0.008 MiB print(x.shape)
6 620.789 MiB 0.000 MiB print(x.dtype)
7 620.793 MiB 0.004 MiB x = x.astype('int16', copy=False)
8 del(x)
с той же ошибкой, что и раньше (следовательно, преобразование в строке 7 завершается неудачно).
Насколько я могу судить, я не должен былпроблема с памятью. Массив (12500 на 12500) составляет примерно 600 МБ как int32 и 300 МБ как int16. Так что я даже не приблизился к пределу ~ 2 ГБ Python 32 бит в Windows 10. Разве есть какое-то внутреннее преобразование в float64 / int64 перед преобразованием в int16? Или что-то в этом роде. У меня установлено 32 ГБ оперативной памяти, поэтому это не должно быть причиной.
Я знаю, что могу нарезать данные и / или переключиться на 64-битный Python - но что за проблема с памятью, когда я далекоиз предела памяти (по крайней мере, насколько я могу судить)?
Нашел это: Как исправить "numpy.core._exceptions.MemoryError" при выполнении числового классификатора MNIST? , гдепохоже, что переход на Linux решает проблему (не вариант для меня). Это проблема Windows? Что-то вроде непрерывного выделения памяти?
Также обнаружил, что Невозможно выделить массив с формой и типом данных . Может быть, это какая-то проблема с перегрузкой в Windows?
Спасибо за любую помощь.