Almacenar un diccionario de python de claves de 7millions en una base de datos

Tengo que manejar un diccionario de claves de 7 millones (el número de claves eventualmente puede ser de hasta ~ 50 millones). Ya que apenas tengo suficiente memoria para guardarla en la memoria, he decidido almacenarla.

Mi diccionario se ve así:

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

Primero intenté almacenarlo en una base de datos sqlite usando sqlite3. La cantidad de tiempo requerida para almacenarlo está perfectamente bien (alrededor de 70 segundos). Utilizandotimeit:

>>>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

Pero entonces, necesito usar este diccionario almacenado para recuperar ciertos valores, pero cada SELECT parece tomar aproximadamente 1,5 segundos. Como necesito acceder a alrededor de un millón de valores, es desalentador:

>>>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

Entonces intenté actualizar mi diccionario en un estante. Ahora la cantidad de tiempo para obtener un valor en mi diccionario archivado es bastante buena:

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

Entonces, aunque hago varios millones de solicitudes como esta, la cantidad total de tiempo debe ser de alrededor de cien segundos.

Pero surgió un nuevo problema, por ahora el tiempo requerido para almacenar mi diccionario en un estante no me satisface.

>>> 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

Se debe agregar a esta cantidad un tiempo adicional requerido para convertir las claves anteriores (que son tuplas) en una cadena. Utilizando repr:

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

Lo que hace un total de 566.332387924 para actualizar mi diccionario en un estante ...

No quiero decapar mi diccionario, ya que implica que tendré que cargar todo el diccionario si quiero usarlo más tarde.

¿Hay alguna forma en que pueda mejorar uno de estos dos métodos para tener mejores tiempos de acceso / carga?

Gracias por tu ayuda !

Respuestas a la pregunta(1)

Su respuesta a la pregunta