мой друг написал эту небольшую прогамму. размер textFile
составляет 1,2 ГБ (газета за 7 лет). Ему удалось создать словарь, но он не может записать его в файл с помощью pickle (зависает программа).Сохранение огромного словаря bigram в файл с использованием 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)
благодарит заранее.
EDIT
для тех, кто заинтересован я кратко объяснить, что делает эта программа. если у вас есть файл отформатированного примерно так:
<s>
Hello
,
World
!
</s>
<s>
Hello
,
munde
!
</s>
<s>
World
domination
.
</s>
<s>
Total
World
domination
!
</s>
<s>
являются приговоры сепараторов.- одно слово в строке.
a biGramDictionary создан для последующего использования.
что-то вроде этого:
{
"Hello": {"World": 1, "munde": 1},
"World": {"domination": 2},
"Total": {"World": 1},
}
надеюсь, что это помогает. в настоящее время стратегия изменилась на использование mysql, потому что sqlite просто не работал (вероятно, из-за размера)
Если вы собираетесь возиться с большими файлами, почему бы не использовать базу данных? Кроме того, я вижу, что вы делаете цикл за один файл 2 раза, что может быть избыточным и добавляет к стоимости обработки. почему бы не описать, что вы делаете с образцами входных файлов? – ghostdog74
ghostdog74, вы видите 2 для операторов, но есть только один цикл над файлом :) Итерирование по файлу - это просто чтение строк (из фактической позиции), оно не стремится к началу файла. – Messa
Просто попробуйте [sqlitedict] (https://pypi.python.org/pypi/sqlitedict) (ваш Python dict, поддерживаемый БД на диске, а не ОЗУ). – Radim