使用泡菜将巨大的二元字典保存到文件中

Joã*_*ela 6 python dictionary file pickle

我的一个朋友写了这个小程序.这textFile是1.2GB的大小(7年的报纸).他成功地设法创建了字典,但他不能使用pickle(程序挂起)将其写入文件.

import sys
import string
import cPickle as pickle

biGramDict = {}

textFile = open(str(sys.argv[1]), 'r')
biGramDictFile = open(str(sys.argv[2]), 'w')


for line in textFile:
   if (line.find('<s>')!=-1):
      old = None
      for line2 in textFile:
         if (line2.find('</s>')!=-1):
            break
         else:
            line2=line2.strip()
            if line2 not in string.punctuation:
               if old != None:
                  if old not in biGramDict:
                     biGramDict[old] = {}
                  if line2 not in biGramDict[old]:
                     biGramDict[old][line2] = 0
                  biGramDict[old][line2]+=1
               old=line2

textFile.close()

print "going to pickle..."    
pickle.dump(biGramDict, biGramDictFile,2)

print "pickle done. now load it..."

biGramDictFile.close()
biGramDictFile = open(str(sys.argv[2]), 'r')

newBiGramDict = pickle.load(biGramDictFile)
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑
任何感兴趣的人我将简要解释这个程序的作用.假设您的文件格式大致如下:

<s>
Hello
,
World
!
</s>
<s>
Hello
,
munde
!
</s>
<s>
World
domination
.
</s>
<s>
Total
World
domination
!
</s>
Run Code Online (Sandbox Code Playgroud)
  • <s> 是句子分隔符.
  • 每行一个字.

生成biGramDictionary供以后使用.
这样的事情:

{
 "Hello": {"World": 1, "munde": 1}, 
 "World": {"domination": 2},
 "Total": {"World": 1},
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.现在策略改为使用mysql,因为sqlite不起作用(可能是因为它的大小)

Wim*_*Wim 10

Pickle仅用于编写完整(小)对象.您的字典有点大,甚至可以保留在内存中,您最好使用数据库,这样您就可以逐个存储和检索条目,而不是一次性存储和检索.

您可以在Python中使用的一些优秀且易于集成的单一文件数据库格式是SQLiteDBM变体之一.最后一个就像一个字典(即你可以读取和写入键/值对),但使用磁盘作为存储而不是1.2 GB的内存.