Резюмепамяти не освобождаются при принятии небольшого кусочка DataFrame
adataframe
является DataFrame
с 800K строк. Естественно, он потребляет немного памяти. Когда я это делаю:
adataframe = adataframe.tail(144)
память не отпущена.
Вы можете утверждать, что это выпущено, но, похоже, оно используется, но оно помечено как свободное и будет повторно использоваться Python. Однако, если я попытаюсь создать новый 800k-ряд DataFrame
, а также сохранить только небольшой фрагмент, использование памяти будет расти. Если я снова это сделаю, он будет расти снова, до бесконечности.
Я использую Debian Jessie's Python 3.4.2 с Pandas 0.18.1 и numpy 1.11.1.
Демонстрация с минимальной программой
со следующей программой создать словарь
data = {
0: a_DataFrame_loaded_from_a_CSV,_only_the_last_144_rows,
1: same_thing,
# ...
9: same_thing,
}
и я контролировать использование памяти в то время как я создаю словарь. Вот оно:
#!/usr/bin/env python3
from resource import getrusage, RUSAGE_SELF
import pandas as pd
def print_memory_usage():
print(getrusage(RUSAGE_SELF).ru_maxrss)
def read_dataframe_from_csv(f):
result = pd.read_csv(f, parse_dates=[0],
names=('date', 'value', 'flags'),
usecols=('date', 'value', 'flags'),
index_col=0, header=None,
converters={'flags': lambda x: x})
result = result.tail(144)
return result
print_memory_usage()
data = {}
for i in range(10):
with open('data.csv') as f:
data[i] = read_dataframe_from_csv(f)
print_memory_usage()
Результаты
Если data.csv
содержит только несколько строк (например, 144, в этом случае нарезка избыточен), использование памяти растет очень медленно. Но если data.csv
содержит 800K строк, результаты похожи на эти:
52968
153388
178972
199760
225312
244620
263656
288300
309436
330568
349660
(Добавление gc.collect()
перед print_memory_usage()
не делает существенной разницы.)
Что я могу поделать?
Действительно, если я изменяю 'result = result.tail (144)' to 'result = result.tail (144) .copy(); gc.collect() ', он потребляет на 100 М меньше после 10 итераций. Однако он все еще растет, растет и растет, хотя и с меньшими темпами. –