Привет всем, у меня есть файл на диске, который содержит только 168 МБ. Это просто разделенный запятыми список слов, id слово может быть длиной 1-5 слов. Там 6,5 млн. Линий. Я создал словарь на python, чтобы загрузить его в память, чтобы я мог искать входящий текст в отношении этого списка слов. Когда python загружает его в память, он показывает 1,3 ГБ используемого пространства RAM. Любая идея, почему это так?
так что пусть мой файл слов выглядит так...
1,word1
2,word2
3,word3
затем добавьте 6,5 миллиона к этому Затем я просматриваю этот файл и создаю словарь (python 2.6.1)
def load_term_cache():
"""will load the term cache from our cached file instead of hitting mysql. If it didn't
preload into memory it would be 20+ million queries per process"""
global cached_terms
dumpfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms.txt')
f = open(dumpfile)
cache = csv.reader(f)
for term_id, term in cache:
cached_terms[term] = term_id
f.close()
Просто это взрывает память. Я просматриваю монитор активности, и он привязывает всю память до 1,5 ГБ ОЗУ. На моем ноутбуке он просто начинает меняться. Любые идеи, как наиболее эффективно хранить пары ключ/значение в памяти с помощью python?
спасибо
UPDATE: я пытался использовать модуль anydb, и после 4,4 миллиона записей он просто умирает число с плавающей запятой - прошедшие секунды, так как я пытался загрузить его
56.95
3400018
60.12
3600019
63.27
3800020
66.43
4000021
69.59
4200022
72.75
4400023
83.42
4600024
168.61
4800025
338.57
вы можете видеть, что он отлично работает. 200 000 строк каждые несколько секунд вставлены до тех пор, пока я не ударил стену, и время удвоилось.
import anydbm
i=0
mark=0
starttime = time.time()
dbfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms')
db = anydbm.open(dbfile, 'c')
#load from existing baseterm file
termfile = os.path.join(os.getenv("MY_PATH"), 'datafiles', 'baseterms.txt.LARGE')
for line in open(termfile):
i += 1
pieces = line.split(',')
db[str(pieces[1])] = str(pieces[0])
if i > mark:
print i
print round(time.time() - starttime, 2)
mark = i + 200000
db.close()