#python #numpy #memory-management #out-of-memory
#python #numpy #управление памятью #нехватка памяти
Вопрос:
Я пытаюсь выполнить этот код:
for i in Fil:
for k in DatArr:
a = np.zeros(0)
for j in Bui:
a = np.hstack([a,DatDifCor[k][i,j]])
DatDifPlt[k].update({i:a})
Но это выдает мне эту ошибку:
Traceback (most recent call last):
File "<ipython console>", line 5, in <module>
File "C:Python26libsite-packagesnumpycoreshape_base.py", line 258, in hstack
return _nx.concatenate(map(atleast_1d,tup),1)
MemoryError
Я думал, что это в первую очередь из-за нехватки оперативной памяти, но затем я попробовал на ПК с 48 Гб оперативной памяти, и это выдало ту же ошибку. Достиг ли я максимального размера для NumPy.array?
Комментарии:
1. 64-Разрядная операционная система?
2. я запускаю его в 64-разрядной ОС Windows, но python, похоже, не справляется с этим…
Ответ №1:
MemoryError
Всегда означает, что попытка выделить память завершилась неудачей. Попытка создать массив, превышающий максимальный размер массива, приводит к ValueError
:
>>> a = numpy.arange(500000000)
>>> numpy.hstack((a, a))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/pymodules/python2.6/numpy/core/shape_base.py", line 258, in hstack
return _nx.concatenate(map(atleast_1d,tup),1)
ValueError: array is too big.
Обратите внимание, что 48 ГБ — это также конечный объем памяти, и что ваша операционная система (или даже аппаратная платформа) может ограничить размер одного процесса 4 ГБ.
Комментарии:
1. @Sven: Запускаемый мной процесс Python увеличивает использование оперативной памяти с 5,85 ГБ (используется в различных симуляциях Modelica) до 7,40 ГБ (из 48 ГБ), после чего я получаю ошибку памяти, что означает, что процесс использует «всего» 1,55 ГБ…
2. @rubae: Это не отменяет того, что у вас заканчивается память. Если процесс использует 1,55 ГБ и пытается выделить 3 ГБ, вы получите
MemoryError
, если процессы ограничены 4 ГБ. Я предлагаю добавить некоторые выходные данные отладки в цикл, который показывает размер массива, которыйhstack()
собирается создать.3. @Sven: ах, я только что узнал, что использую 32-разрядную версию Python (x, y) / Spyder на 64-разрядном компьютере, возможно, проблема решается установкой 64-разрядной версии…
4. @Sven: знаете ли вы правильный способ определить, сколько памяти точно требуется, например, для этого процесса в цикле с помощью hstack () ? По-видимому, нет достойной 64-разрядной версии для Python (x, y), для Numpy и так далее. (?)
5. @rubae: Новый массив, созданный вашим
hstack()
вызовом, будет заниматьa.nbytes DatDifCor[k][i,j].nbytes
байты при условии, что оба объекта, которые вы складываете, являются массивами NumPy одного и того же dtype. Старый массивa
будет освобожден только после создания нового.