мой друг записал эту небольшую проножку. textFile
1.2 ГБ в размере (ценность 7 лет газет). Ему успешно удается создать словарь, но он не может записать это в файл с помощью рассола (программа зависает).
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)
заранее спасибо.
Править
поскольку любой заинтересовал, я кратко объясню, что делает эта программа. принятию Вас форматировали файл примерно как это:
<s>
Hello
,
World
!
</s>
<s>
Hello
,
munde
!
</s>
<s>
World
domination
.
</s>
<s>
Total
World
domination
!
</s>
<s>
разделители предложений. biGramDictionary сгенерирован для более позднего использования.
что-то вроде этого:
{
"Hello": {"World": 1, "munde": 1},
"World": {"domination": 2},
"Total": {"World": 1},
}
надеюсь, это поможет. прямо сейчас стратегия изменилась на использование mysql, потому что sqlite просто не работал (вероятно, из-за размера)
Парил предназначен только для запускаемых (небольших) объектов. Ваш словарь немного большой, чтобы даже удерживать в памяти, вам лучше использовать базу данных вместо этого, чтобы вы могли хранить и получать записи один за другим вместо всего сразу.
Некоторые хорошие и легко интегрируемые форматы базы данных Singe, вы можете использовать из Python, - это SQLite или один из вариантов вариантов дБм . Последний выступает так же, как словарь (то есть. Вы можете читать и писать ключ / Value-Pars), но использует диск в качестве хранилища, а не 1,2 ГБ памяти.
Вам действительно нужны все данные в памяти? Вы можете разделить его наивно, как один файл для каждого года каждый месяц, если вы хотите подход словаря / сортировки.
Кроме того, помните, что словари не отсортированы, вы можете иметь проблемы, необходимые для удовлетворения, что Ammount данных. Если вы хотите выполнить поиск или отсортировать данные, конечно, ...
В любом случае, я думаю, что подход базы данных прокомментировал ранее, является наиболее гибким, специально в долгосрочной перспективе ...
Одним из растворов является использование Buzhug вместо сортировки. Это чистое решение Python и сохраняет очень синтаксис Pythonic. Я думаю об этом, как следующий шаг от отслой и их ILK. Он будет обрабатывать размеры данных, о которых вы говорите. Его ограничение размера составляет 2 ГБ на поле (каждое поле хранится в отдельном файле).
Если ваш действительно, правда желает использовать словарь, подобную семантике, попробуйте ассоциацию SQLALCHEMYS
. Следующий (довольно длительный) кусок кода переводит ваш словарь в клавишу , пары значений в записях
. Я не знаю, как SQLALCHEMY справляется с вашим большим словарем, но SQLite должен иметь возможность справиться с ним хорошо.
from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Integer, ForeignKey, Unicode, UnicodeText
from sqlalchemy.orm import mapper, sessionmaker, scoped_session, Query, relation
from sqlalchemy.orm.collections import column_mapped_collection
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.schema import UniqueConstraint
engine = create_engine('sqlite:///newspapers.db')
metadata = MetaData()
metadata.bind = engine
Session = scoped_session(sessionmaker(engine))
session = Session()
newspapers = Table('newspapers', metadata,
Column('newspaper_id', Integer, primary_key=True),
Column('newspaper_name', Unicode(128)),
)
entries = Table('entries', metadata,
Column('entry_id', Integer, primary_key=True),
Column('newspaper_id', Integer, ForeignKey('newspapers.newspaper_id')),
Column('entry_key', Unicode(255)),
Column('entry_value', UnicodeText),
UniqueConstraint('entry_key', 'entry_value', name="pair"),
)
class Base(object):
def __init__(self, **kw):
for key, value in kw.items():
setattr(self, key, value)
query = Session.query_property(Query)
def create_entry(key, value):
return Entry(entry_key=key, entry_value=value)
class Newspaper(Base):
entries = association_proxy('entry_dict', 'entry_value',
creator=create_entry)
class Entry(Base):
pass
mapper(Newspaper, newspapers, properties={
'entry_dict': relation(Entry,
collection_class=column_mapped_collection(entries.c.entry_key)),
})
mapper(Entry, entries)
metadata.create_all()
dictionary = {
u'foo': u'bar',
u'baz': u'quux'
}
roll = Newspaper(newspaper_name=u"The Toilet Roll")
session.add(roll)
session.flush()
roll.entries = dictionary
session.flush()
for entry in Entry.query.all():
print entry.entry_key, entry.entry_value
session.commit()
session.expire_all()
print Newspaper.query.filter_by(newspaper_id=1).one().entries
дает
foo bar
baz quux
{u'foo': u'bar', u'baz': u'quux'}