Управление памятью Python во время перераспределения переменных

#python #arrays #pandas #numpy #memory

Вопрос:

Допустим, у меня есть функция, возвращающая большой массив numpy:

 def generate_1GB_array():  ...  return array_1GB  array_1GB = generate_1GB_array()  

и еще одна функция для изменения массива:

 def modify_array(array):  return array   1  

Теперь предположим, что я запускаю этот сценарий:

 array_1GB = modify_array(array_1GB)  

Мой вопрос в том, достигает ли этот скрипт максимума при использовании 1 ГБ или 2 ГБ памяти?

Насколько я понимаю, переменная array_1GB теперь указывает на новый объект массива, созданный функцией modify_array. Количество ссылок на старый массив падает до 0, так что это мусор, собранный. Я предполагаю, что процесс не является мгновенным, поэтому существует короткий промежуток времени, когда два массива остаются в памяти, поэтому использование выбора памяти на самом деле составляет 2 ГБ.

На самом деле, в документации pandas приведен этот пример:

 files = pathlib.Path("data/timeseries/").glob("ts*.parquet") counts = pd.Series(dtype=int) for path in files:  df = pd.read_parquet(path)  counts = counts.add(df["name"].value_counts(), fill_value=0) counts.astype(int)  

В документации говорится: «Максимальное использование памяти в этом рабочем процессе-это самый большой фрагмент, плюс небольшая серия, в которой до этого момента учитывается уникальное значение«.

Разве это не должно быть в 2 раза больше одного фрагмента (при условии, что все равны) небольшая серия ? Я что-то упускаю ?

Комментарии:

1. При этом a = a 1 создается новый массив, а затем присваивается переменной a . Предыдущий массив затем свободен для gc. Таким образом, временно использование памяти удваивается. Даже a = 1 временно буферизует результат.

2. В вашем примере с пандами самый большой кусок будет df из только что прочитанного файла. Насколько я понимаю, временно будет два кадра такого размера. Но кадры не накапливаются в памяти. counts меньше, просто серия, но она тоже должна создавать новую серию с каждым add . pandas объекты используют несколько массивов, в зависимости от типов и индексов dtypes.