Python上的字典和大输入

时间:2014-03-02 20:14:28

标签: python dictionary

我有一个很大的输入20Gb文本文件,我处理。我创建了一个索引,我存储在一个字典中。问题是我为文件中的每个术语访问此dict以及每个术语我可能将其作为项添加到dict中,因此我不能将其写入磁盘。当我达到我的最大RAM容量(8gb ram)时,系统(win8 64位)开始分页到虚拟内存,因此I / O非常高,系统不稳定(我有蓝屏1次)。知道怎样才能改进它?


编辑例如psedocode

input = open("C:\\input.txt",'r').read()
text = input.split()
temp_dict = {}
for i,word in text:
    if word in temp_dict :
      text[i] = something()          
    else:
      temp_dict[word] = hash_function()

print(temp_dict , file=...)
print(text, file=...)

2 个答案:

答案 0 :(得分:1)

不要将整个文件读入内存,你应该这样做:

with open("/input.txt",'rU') as file:
    index_dict = {}
    for line in file:
        for word in line.split()
            index_dict.setdefault(word, []).append(file.tell() + line.find(word))

要将其分解,请使用上下文管理器打开文件,以便在出现错误时自动为您关闭文件。我还改变了在Unix上工作的路径,并为Universal readline模式添加了U标志。

with open("/input.txt",'rU') as file:

从语义上讲,索引是键入其位置的单词列表,我将dict更改为index_dict:

    index_dict = {}

直接使用文件对象作为迭代器会阻止您将整个文件读入内存:

    for line in file:

然后我们可以分割线并按字迭代:

        for word in line.split()

并使用dict.setdefault方法,如果密钥不在那里,我们会将单词的位置放在一个空列表中,但是如果它在那里,我们只需将它附加到已存在的列表中:< / p>

            index_dict.setdefault(word, []).append(file.tell() + line.find(word))

这有帮助吗?

答案 1 :(得分:0)

我建议只使用数据库而不是字典。在最简单的形式中,数据库是基于磁盘的数据结构,意味着跨越几千兆字节。

例如,您可以查看sqlite3SQLAlchemy

此外,您可能不希望立即将整个输入文件加载到内存中。