Pandas GroupBy освобождение памяти

проблема

Я заметил, что память, выделенная при повторении через объект Pandas GroupBy, не освобождается после итерации. Я использую resource.getrusage(resource.RUSAGE_SELF).ru_maxrss ( второй ответ в этом сообщении для подробностей ), чтобы измерить общий объем активной памяти, используемой процессом Python.

 import resource import gc import pandas as pd import numpy as np i = np.random.choice(list(range(100)), 4000) cols = list(range(int(2e4))) df = pd.DataFrame(1, index=i, columns=cols) gb = df.groupby(level=0) # gb = list(gb) for i in range(3): print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6) for idx, x in enumerate(gb): if idx == 0: print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1e6) # del idx, x # gc.collect() 

печатает следующую общую активную память (в гб)

 0.671732 1.297424 1.297952 1.923288 1.923288 2.548624 

Решения

Недостатки del idx, x и gc.collect() устраняют проблему. Тем не менее, мне приходится обрабатывать все переменные, которые ссылаются на DataFrames, возвращаемые путем итерации по группе (что может быть болью в зависимости от кода во внутреннем цикле). Новые способы использования печатной памяти:

 0.671768 1.297412 1.297992 1.297992 1.297992 1.297992 

В качестве альтернативы я могу раскомментировать gb = list(gb) . Полученные в результате операции памяти примерно такие же, как и в предыдущем решении:

 1.32874 1.32874 1.32874 1.32874 1.32874 1.32874 

Вопросов

  1. Почему память для DataFrames, возникающая в результате итерации через группу, не освобождается после завершения итерации?
  2. Есть ли лучшее решение, чем два выше? Если нет, то какое из этих двух решений «лучше»?

2 Solutions collect form web for “Pandas GroupBy освобождение памяти”

Память странности

Это очень интересно! Вам не нужен del idx, x . Только использование gc.collect() работало, чтобы сохранить постоянную память для меня. Это намного более чистое, что имеет выражения del внутри цикла.

Почему память для DataFrames, возникающая в результате итерации через группу, не освобождается после завершения итерации?

Нигде в вашем коде вы не являетесь объектом gb , а это значит, что в конце все еще есть. Одна вещь состоит в том, чтобы итератор дошел до конца своего цикла, тогда я ожидал бы, что он умрет автоматически, но объект, который вызвал итератор, сохраняется, если вам нужно сделать что-то еще (повторить снова, заполнить и т. Д.), ,

  • Может ли от __future__ импортировать ... гарантировать совместимость Python 2 и 3?
  • Python 3 urllib создает TypeError: данные POST должны быть байтами или итерируемыми байтами. Это не может быть типа str
  • Отсутствуют значения веб-страницы при очистке данных с помощью BeautifulSoup python 3.6
  • Преобразование String в Int с использованием try / except в Python
  • Почему этот генератор python возвращает одно и то же значение каждый раз?
  • django.db.utils.OperationalError независимо от того, что я пытаюсь
  • import httplib ImportError: нет модуля с именем httplib
  • python 3-х этажное разделение не всегда приводит к int
  • Python - лучший язык программирования в мире.