文件内存优化中的Python集
我对python非常陌生。在python脚本中,我需要检查输入字符串是否存在于集合“titles”中;我从文件“标题”中以换行符分隔的字符串加载它。它消耗大量内存。我选择存储在集合中,因为标题中有文件内存优化中的Python集,python,memory,membership,large-data,Python,Memory,Membership,Large Data,我对python非常陌生。在python脚本中,我需要检查输入字符串是否存在于集合“titles”中;我从文件“标题”中以换行符分隔的字符串加载它。它消耗大量内存。我选择存储在集合中,因为标题中有if inputstring:稍后 Line # Mem usage Increment Line Contents ================================================ 1 6.160 MiB 0.000 MiB @
if inputstring:
稍后
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)
Q1。是否有其他更高效的对象类型来存储此大数据?
我能想到的一个解决方案是,如果我以字符串形式加载文件,它消耗的内存与filesize完全相同;这是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()
然后,如果在标题中输入字符串+“\n”,我可以执行:
Q2。有更快的替代方法吗?您可以:
- 如果查找了很多键,请使用键/值存储
- 逐行遍历文件,如果只有几个键需要查找,则检查是否存在键
@Nexu,
titles=set(titles)
不是必需的<代码>标题已经是设置
对象。({…for..in…}
已设置。)哦,是的。但只保存1个MiB。(Python2.7.3)不知怎的,您的速度太慢了。我想我现在还是用字符串中的字符串比较吧。@Nexu,如果在标题中输入字符串是多次还是一次?两次。检查的字符串稍有不同。它根据用户输入执行。这将如何影响它?使用或搁置,它节省了大约128个MiB内存。您有什么改进建议吗?@Nexu,什么样的内存阈值能让您满意?你不能无休止地降低内存占用,因为你永远不会得到满意的结果。dict可以帮我(@500M内存)。我只是想问,如果有其他类似字典的对象,代码是否还能更有效。@Nexu,您可以对输入文件进行预排序,并为每个起始字符创建带有偏移量的表。您可以对dict对象使用lru缓存。您可以使用memcached/redis/sqlite3/postgres或任何其他数据库引擎
def loadtitles():
with open('titles') as f:
titles = {word for line in f for word in line.split()}