【问题标题】:Saving memory on pickle dumping在泡菜倾倒时节省内存
【发布时间】:2019-02-05 07:58:03
【问题描述】:

在运行第三方脚本为深度学习模型生成特征时,我遇到了内存/交换问题。当我运行生成这些功能并将它们保存到 pkl 文件的脚本时,我得到了这个输出:

generate unigram
Headline unigram done
Killed

代码sn-p是:

    print "generate unigram"
    data["Headline_unigram"] = data["Headline"].map(lambda x: preprocess_data(x))
    print "Headline unigram done"
    data["articleBody_unigram"] = data["articleBody"].map(lambda x: preprocess_data(x))
    print "Body unigram done"

    print "generate bigram"
    join_str = "_"
    data["Headline_bigram"] = data["Headline_unigram"].map(lambda x: ngram.getBigram(x, join_str))
    print "Headline bigram done"
    data["articleBody_bigram"] = data["articleBody_unigram"].map(lambda x: ngram.getBigram(x, join_str))
    print "Body bigram done"

    print "generate trigram"
    join_str = "_"
    data["Headline_trigram"] = data["Headline_unigram"].map(lambda x: ngram.getTrigram(x, join_str))
    print "Headline trigram done"
    data["articleBody_trigram"] = data["articleBody_unigram"].map(lambda x: ngram.getTrigram(x, join_str))
    print "Body trigram done"

    with open(cwd+'data.pkl', 'wb') as outfile:
        cPickle.dump(data, outfile, -1)
        print 'dataframe saved in data.pkl'

它几乎可以为 pandas 数据框中的两列生成一元/二元/三元。 data 对象很大,包含 900k 个条目,这就是我遇到 RAM/交换问题的原因。我的问题是,在每一行之后保存到泡菜文件(又名转储)并释放该行使用的内存的正确方法是什么。例如:

做完之后

data["Headline_unigram"] = data["Headline"].map(lambda x: preprocess_data(x))

如何将其保存到 .pkl 文件并释放 data["Headline"] 正在使用的内存而不丢失其内容?由于这是第三方代码,所以修改完全不应该改变data.pkl的结构

谢谢, 卢卡斯。

【问题讨论】:

  • 一条评论,与您的问题没有直接关系:您可以将data["Headline_unigram"] = data["Headline"].map(lambda x: preprocess_data(x)) 简化为data["Headline_unigram"] = data["Headline"].map(preprocess_data)
  • 这仍然适用于 2.7?此修改是否有任何内存增益?
  • 对于 2.7 也是如此。不节省任何内存,只是简化您的代码。

标签: python python-2.7 pickle


【解决方案1】:

怎么样

with open("head_line.pkl", "wb") as fh:
    cPickle.dump(data["Headline"], fh)
del data["Headline"]

等等……

但这会导致多个文件。

此外,您可以在开头import gc,然后在其间运行gc.collect。但是你不能相信这会删除所有未使用的对象。

一旦对象在给定的执行环境中最后一次使用,Python 应该会自动释放内存。 (见gc

【讨论】:

  • 将尝试返回结果。谢谢。
  • 我刚刚添加了额外的酸洗,以防您希望标题条目不受数据影响。
  • 我想过。稍后我将不得不将多个文件合并到一个文件中,您认为 pandas 有一种有效的方法来做到这一点,而无需一次将所有内容加载到内存中吗?
  • 这取决于你想对腌制数据做什么。您可以独立处理文件还是同时需要所有数据?
  • 尝试一次加载一列,但仍然存在内存问题。将 Dockerize 并发送到 DC/OS。感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2015-11-15
  • 2021-12-04
  • 2018-01-27
  • 2013-05-12
相关资源
最近更新 更多