【发布时间】:2016-11-05 08:56:37
【问题描述】:
总结
adataframe 是一个有 800k 行的 DataFrame。自然,它会消耗一些内存。当我这样做时:
adataframe = adataframe.tail(144)
内存未释放。
您可能会争辩说它 已发布,但它似乎已被使用,但它被标记为免费并且将被 Python 重用。但是,如果我尝试创建一个新的 800k 行 DataFrame 并且只保留一小部分,则内存使用量会增加。如果我再做一次,它会再次增长,无穷无尽。
我正在使用 Debian Jessie 的 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
(在print_memory_usage() 之前添加gc.collect() 不会产生任何显着差异。)
我该怎么办?
【问题讨论】:
标签: pandas