Ошибка памяти в np.hstack()

#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 будет освобожден только после создания нового.