У меня проблемы с пониманием утечки памяти в моем коде. Я полагаю, что моя ошибка связана с изменчивостью numpy массивов, поскольку ее можно решить с помощью .copy()
.
Я не понимаю, почему это происходит. Вот минимальный пример кода с утечкой памяти, который использует около 1600 МБ в памяти:
import numpy as np
import sys
k_neighbours = 5
np.random.seed(42)
data = np.random.rand(10000)
for _ in range(3):
closest_neighbours = [
# get indices of k closest neighbours
np.argpartition(
np.abs(data-point),
k_neighbours
)[:k_neighbours]
for point in data
]
print('\nsize:',sys.getsizeof(closest_neighbours))
print('first 3 entries:',closest_neighbours[:3])
А вот тот же код, но с добавленным .copy()
. Похоже, это решает проблему: программа занимает около 80 МБ памяти, как я и ожидал.
for _ in range(3):
closest_neighbours = [
# get indices of k closest neighbours
np.argpartition(
np.abs(data-point),
k_neighbours
)[:k_neighbours].copy()
for point in data
]
print('\nsize:',sys.getsizeof(closest_neighbours))
print('first 3 entries:',closest_neighbours[:3])
Окончательный результат одинаков для обоих:
size: 87624
first 3 entries: [
array([ 0, 3612, 2390, 348, 3976]),
array([ 1, 6326, 2638, 9978, 412]),
array([5823, 5866, 2, 1003, 9307])
]
, как и ожидалось .
Я бы подумал, что np.argpartition()
создает новый объект, и поэтому я не понимаю, почему copy()
решает проблему с памятью. Даже если это не так, и np.argpartition()
каким-то образом изменяет сам объект data
, почему это приводит к утечке памяти?