Python 从文件内存优化中设置
Posted
技术标签:
【中文标题】Python 从文件内存优化中设置【英文标题】:Python set from file memory optimization 【发布时间】:2014-03-24 22:59:43 【问题描述】:我对 python 很陌生。在 python 脚本中,我需要检查输入字符串是否存在于集合“标题”中;我从文件“标题”中的换行符分隔字符串加载。它消耗巨大的内存。我选择存储在集合中,因为稍后会有if inputstring in titles:
。
Line # Mem usage Increment Line Contents
================================================
1 6.160 MiB 0.000 MiB @profile
2 def loadtitles():
3 515.387 MiB 509.227 MiB titles = open('titles').read().split()
4 602.555 MiB 87.168 MiB titles = set(titles)
第一季度。有没有其他更高效的对象类型来存储这些大数据?
我能想到的一个解决方案是,如果我将文件加载为字符串,它消耗的内存与文件大小完全相同;这是 100% 的最佳内存消耗。
Line # Mem usage Increment Line Contents
================================================
1 6.160 MiB 0.000 MiB @profile
2 def loadtitles():
3 217.363 MiB 211.203 MiB titles = open('titles').read()
那我可以if inputstring+'\n' in titles:
第二季度。有没有更快的替代方案?
【问题讨论】:
【参考方案1】:迭代文件(逐行处理)而不是读取文件的全部内容将减少内存消耗。 (结合生成器表达式):
def loadtitles():
with open('titles') as f:
titles = word for line in f for word in line.split()
【讨论】:
@Nexu,titles = set(titles)
不是必需的。 title
已经是 set
对象。 ( ... for .. in ...
是集合理解。)
哦,是的。 Screenshot2。虽然只节省了 1 MiB。 (python 2.7.3)
不知何故,你suggested 的那个太慢了。我想我现在会在字符串比较中坚持使用字符串。
@Nexu,if inputstring in titles
是多次还是一次?
两次。检查略有不同的字符串。它根据用户输入执行。这将如何影响它?【参考方案2】:
您可以:
如果您查找大量键,请使用键/值存储。 逐行遍历文件,如果只有几个键要查找,则检查键是否存在。【讨论】:
使用dict或shelve,可节省约128 MiB内存。您对此有何改进建议? @Nexu,什么内存阈值会满足你?你不能无休止地减少内存占用,因为你永远不会达到令人满意的结果。 dict 对我有用(@ 500M 内存)。我只是在问是否可以使用任何替代的类似字典的对象以某种方式使该代码更有效。 @Nexu,您可以对输入文件进行预排序并为每个起始字符创建带有偏移量的表。您可以将 lru 缓存用于 dict 对象。您可以使用 memcached/redis/sqlite3/postgres 或任何其他数据库引擎以上是关于Python 从文件内存优化中设置的主要内容,如果未能解决你的问题,请参考以下文章