Хранение 7-миллионного ключа Python-словаря в базе данных

Я должен обработать словарь ключей на 7 миллионов (количество ключей может в конечном итоге составить ~ 50 миллионов). Поскольку у меня едва хватает памяти, чтобы сохранить ее в памяти, я решил сохранить ее.

Мой словарь выглядит так:

dictionary={(int1,int2):int3,...}

Сначала я попытался сохранить его в базе данных sqlite с помощью sqlite3. Количество времени, необходимое для его хранения, совершенно нормально (около 70 секунд). С помощьюtimeit:

>>>import sqlite3
>>>conn=sqlite3.connect('test_sqlite.sqlite')
>>>c=conn.cursor()
>>>c.execute('create table test (int1 int, int2 int, int3 int)')
>>>conn.commit()
>>>conn.close()
>>>import timeit
>>>timeit.timeit('c.executemany("insert into test values (?,?,?)",((key[0],key[1],dictionary[key]) for key in dictionary.iterkeys())),setup='import sqlite3;conn=sqlite3.connect("test_sqlite.sqlite");c=conn.cursor();dictionary={(i,i+1):i+2 for i in xrange(7000000)}',number=1)
70.7033872604

Но затем мне нужно использовать этот сохраненный словарь для извлечения определенных значений, но каждый SELECT, кажется, занимает приблизительно 1,5 секунды. Так как мне нужно получить доступ к миллиону значений, это обескураживает:

>>>timeit.timeit('c.execute("select id1 from test where id2=={}".format(value)).fetchone()[0]',setup=import sqlite3;conn=sqlite3.connect("test_sqlite.sqlite");c=conn.cursor();value=5555',number=1)
1.5300869941711426

Затем я попытался обновить свой словарь на полке. Теперь достаточно времени, чтобы получить значение в моем полочном словаре:

>>> timeit.timeit('a=f[key]',setup='import shelve;f=shelve.open("test_timeit","r");key="1000"',number=10000)
0.320019006729126

Таким образом, даже несмотря на то, что я делаю несколько миллионов запросов, подобных этому, общее время должно составлять около ста секунд.

Но возникла новая проблема, потому что время, необходимое для хранения моего словаря на полке, меня не удовлетворяет.

>>> timeit.timeit('f.update(dictio)',setup='import shelve;f=shelve.open("test_timeit","c");dictio={"({},{})".format(i,i+1):i+2 for i in xrange(7000000)}',number=1)
504.728841782

К этой сумме нужно добавить дополнительное время, необходимое для преобразования прежних ключей (которые являются кортежами) в строку. Используя repr:

>>>timeit.timeit('repr.repr((1,2))',setup='import repr',number=7000000)
61.6035461426

Что делает в общей сложности 566,332387924, чтобы обновить мой словарь в полку ...

Я не хочу мариновать свой словарь, поскольку это означает, что мне придется загружать весь словарь, если я захочу использовать его позже.

Есть ли способ улучшить один из этих двух методов, чтобы улучшить время доступа / время загрузки?

Спасибо за вашу помощь !

Ответы на вопрос(1)

Ваш ответ на вопрос