Утечка памяти в цикле Python - PullRequest
0 голосов
/ 14 мая 2018

Я работаю над большим проектом, и там я вижу непрерывное увеличение использования памяти. Код похож на мою демонстрацию, приведенную ниже, но не со случайными числами и более полезными вычислениями ... Но эффект тот же. Запустив это, я вижу увеличение использования памяти

Почему это происходит и как я могу предотвратить это? Спасибо за каждый полезный ответ:)

Я использую Python 3

n= 10000000
indat = np.random.random(n*4)
data = np.zeros(n*3)

d = [0,0,0,0]
for i in range(n):  
    d = indat[i*4:i*4+4]
    data[i*3]  = np.sqrt(np.abs(d[0]+d[1]*d[3]))
    data[i*3+1]= np.sqrt(np.abs(d[3]+d[2]*d[3]))
    data[i*3+2]= np.sqrt(np.abs(d[2]+d[1]*d[3]))

EDIT: Я попробовал еще кое-что:

1: работает как положено - без увеличения памяти

for i in range(n):  
    print(i, end="\r")

2: Но с этим происходит увеличение.

for i in range(n):  
    data[i] = indat[i]**2

Так что, как минимум, эта простая копия не работает, как я ожидаю ... Как мне заставить python сохранить результат моих вычислений в уже выделенной памяти?

1 Ответ

0 голосов
/ 10 декабря 2018

Фактически, это увеличение использования памяти происходит потому, что Numpy оптимизирует хранение массивов нулей в памяти. Поэтому, когда вы заполняете этот большой массив нулей, numpy не может хранить его так же эффективно.

Посмотрите, что произойдет с использованием вашей памяти, если вы создадите массив нулей:

data = np.zeros(1000000000)

Затем посмотрите, что происходит, когда вы создаете массив из них:

data = np.ones(1000000000)

Вы увидите резкое увеличение использования памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...