python - 在泡菜倾倒时节省内存
问题描述
在运行第三方脚本为深度学习模型生成特征时,我遇到了内存/交换问题。当我运行生成这些功能并将它们保存到 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
谢谢,卢卡斯。
解决方案
关于什么
with open("head_line.pkl", "wb") as fh:
cPickle.dump(data["Headline"], fh)
del data["Headline"]
等等...
但这会导致多个文件。
此外,您可以import gc
在开始时然后gc.collect
在其间运行。但是你不能相信这会删除所有未使用的对象。
一旦对象在给定的执行环境中最后一次使用,Python 应该会自动释放内存。(见gc)
推荐阅读
- python - 给定每一行对应的索引,从一个矩阵中获取对应的元素
- r - R包安装过程中如何导出环境变量?
- scala - 如何允许/等待 Akka 流在 JVM 关闭时完成?
- hibernate - 休眠多对多使用@OneToMany 或@ManyToMany 针对未映射的类:com.k5008.hib2.Student.modules[com.k5008.hib2.Module]
- c - 使用有限的工具、没有数组和库函数来评估一个简单的数学表达式
- ios - “iPhone 分发”证书不受信任
- python - cs50 PSET6/DNA 正则表达式
- python - 结构数组上的 Pyspark 过滤器
- javascript - 具有相同类名的多个字段上的 jQuery 触发事件
- flutter - Flutter SearchDelegate“BACK”按钮不执行“close()”