文件内存优化中的Python集

文件内存优化中的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 @

我对python非常陌生。在python脚本中,我需要检查输入字符串是否存在于集合“titles”中;我从文件“标题”中以换行符分隔的字符串加载它。它消耗大量内存。我选择存储在集合中,因为标题中有
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()}