Почему numpy.astype выдает ошибку памяти, когда размер nparray ниже предела памяти? - PullRequest
0 голосов
/ 25 октября 2019
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?

Спасибо за любую помощь.

...