繁体   English   中英

如何在Python中加载2个大字典?

[英]How to load 2 big dict in Python?

我是Python的新手。 从两个文件加载两个字典时,出现内存错误。 这两个文件是

with open(filename, 'rb') as f:
  hashtable_album = {}
  for line in f:
    # print i
    p = 0
    q = line.find("####")
    # print p
    # print q
    itembuf = line[p:q]
    # print itembuf
    dictbuf = line[q + 4:-1]
    # print line
    a = json.loads(dictbuf)
    # print a
    # print type(a)
    hashtable_album[itembuf] = a
f.close()
with open(filename2, 'rb') as f2:
  hashtable_item={}
  i=0
  for line in f:
    print len(dic)
    print i
    #print line
    p = 0
    q = line.find("####")
    # print p
    # print q
    itembuf = line[p:q]
    # print itembuf
    dictbuf = line[q + 4:-1]
    # print line
    a = json.loads(dictbuf)
    #print a
    # print type(a)
    hashtable_item[itembuf] = a
    i=i+1
f2.close()

第一个文件大约为400MB,大于第二个文件的大约200MB,我可以成功加载第一个文件,但是当我加载第二个文件时,出现内存错误

  Traceback (most recent call last):
  File "E:/py_workspace/1.0_memory_error.py", line 44, in <module>
    hashtable_item[itembuf] = a
  MemoryError

如果我先更改了将文件加载为读取文件2的顺序,然后又更改了文件1,则在加载第二个文件时也会出现内存错误。 我想内存错误来自dict,所以我将file1加载为后清除了dict

hashtable_album = {}

然后继续加载file2。 这次它没有内存错误。 但是我需要同时使用这两个字典。 那么如何将它们一起加载?

提示:我尝试了cPickle来保存字典,但无法正常工作,并且我也遇到了内存错误。

您可能正在运行32位python。

通过验证

$ python -c "import sys; print sys.maxint" // 64-bit python
9223372036854775807

$ python-32 -c "import sys; print sys.maxint" // 32-bit
2147483647

如果无法摆脱在32位空间中运行的问题,那么您有两种选择

  1. 学习C语言,并使用C语言进行处理。根据文件的输入大小,严格使用内存(mallocs / callocs)可能使您可以将所有内容保存在mem中。
  2. 如果您拥有的算法允许map-reduce,则学习map-reduce并在每个步骤中进行部分文件处理,然后将结果合并到最后一步中,可能会更快。
  3. 不确定,但是您可能想尝试一下Cython。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM