首页 > 解决方案 > 在泡菜倾倒时节省内存

问题描述

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

generate unigram
Headline unigram done
Killed

代码片段是:

    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 数据框中的两列生成 unigrams/bigrams/trigrams。该对象data很大,包含 900k 个条目,这就是我遇到 RAM/交换问题的原因。我的问题是,在每一行之后保存到泡菜文件(又名转储)并释放该行使用的内存的正确方法是什么。例如:

做完之后

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

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

谢谢,卢卡斯。

标签: pythonpython-2.7pickle

解决方案


关于什么

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

等等...

但这会导致多个文件。

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

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


推荐阅读