节省腌菜倾倒时的记忆

时间:2018-08-30 11:26:58

标签: python python-2.7 pickle

运行第三方脚本以生成深度学习模型的功能时,我面临内存/交换问题。运行生成这些功能并将其保存到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数据框中的两列生成了unigram / bigram / trigram。对象data很大,包含90万个条目,这就是为什么我遇到RAM /交换问题的原因。我的问题是,每行之后保存到pickle文件(又称转储)并释放该行使用的内存的正确方法是什么?例如:

完成后

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

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

的所有结构都不应更改

谢谢, 卢卡斯。

1 个答案:

答案 0 :(得分:1)

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

以此类推...

但这将导致多个文件。

此外,您可以在开始时import gc,然后在两者之间运行gc.collect。但是您不能依靠它删除所有未使用的对象。