【问题标题】:Reassigning to Python pandas series: garbage collection重新分配给 Python pandas 系列:垃圾收集
【发布时间】:2014-02-09 18:22:25
【问题描述】:

我正在使用一个 for 循环,将每个大约 1gb 的 tsv 文件加载到 pandas 系列中。它们总是分配给同一个变量,然后我使用 Series.add() 将它们添加到包含系列中数字总数的系列中。

更新:澄清一下,所有 tsv 或多或少都具有相同的索引,因此整个系列的长度并没有真正改变,只是将值相加。

我希望“旧”系列的内存偶尔会被释放,以便内存使用量保持在范围内。但是,内存使用量会增长,直到机器的 62GB 内存用完为止。

有没有人知道如何解决这个问题?我尝试在循环中显式删除变量,并尝试在循环中调用 gc.collect() 。两者都没有帮助。我正在使用 Python 2.73。

更多细节:

在 tsv 文件中,前两列是索引(染色体和位置),第三列是整数。

代码是:

total = pd.read_csv(coverage_file1,sep='\t',index_col=[0,1],header=None,names=  ['depth'],squeeze=True)

for file in coverage_files:
    series = pd.read_csv(file,sep='\t',index_col=[0,1],header=None,names=['depth'],squeeze=True)
    total = total.add(series,fill_value=0).astype(int)
    del series # I tried with and without this and the next line
    gc.collect() 


total.to_csv(args.out,sep='\t',header=None)

【问题讨论】:

  • 它们可能是使用挤压的错误;尝试不使用它(并且只是获取系列的子集);如果不同,请在 github 上提交错误报告
  • @Jeff,没有挤压不会出现同样的问题

标签: python garbage-collection pandas out-of-memory


【解决方案1】:

但是您仍然在total 中积累数据,而series 正在被垃圾收集。也许优化算法?在我看来,您只想加入相同格式的文件,如果是这样,则无需为此使用熊猫。

【讨论】:

  • 嗨。不,我并没有真正累积数据。我没有加入文件,而是计算系列对象的总和。 total 总是保持一系列或多或少相同的长度,只有值增长,但不会过度。
  • 你用的是什么版本的熊猫?我在我的系统上检查了你的脚本,内存消耗没有问题(python2+pandas 0.13.0)。您是否还检查了循环运行了多少次?可能没有足够的内存来加载甚至 1 个系列,因为它可能会产生一些存储数据的开销。
  • 感谢 rsk 的建议。我正在使用熊猫 0.12.0。我有 62Gb 可用,每个文件是 1GB。 for 循环至少运行了几次。我只尝试了 5 个文件并且它可以工作,但是 160 个文件(根据我的需要)它崩溃了。
  • 运行 gc.collect() - 我会说你不是在做第 2 代收集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多