Это не будет работать для всех ситуаций, которые соответствуют вашему описанию, но cPickle
должно помочь со скоростью.
Единственная проблема, о которой я могу подумать, заключается в том, что объединить сохранение данных с IPC сложно. Так что, если эти разные программы изменяют словарь одновременно, pickle
не поможет. Другим подходом может быть использование базы данных ...
Мне нравится предложение Свена Марнаха , но есть некоторые компромиссы, на которые стоит обратить внимание. Некоторая настройка ...
>>> pickle_file = open('pickle_foo', 'w')
>>> anydbm_file = anydbm.open('anydbm_foo', 'c')
>>> d = dict((str(i), str(j)) for i, j in zip(range(999999, -1, -1), range(0, 1000000)))
Очевидно, что заполнение anydbm_file
будет довольно медленным:
>>> %timeit for k, v in d.iteritems(): anydbm_file[k] = v
1 loops, best of 3: 5.14 s per loop
Время сравнимо со временем, которое требуется для выгрузки и загрузки файла рассола:
>>> %timeit cPickle.dump(d, pickle_file)
1 loops, best of 3: 3.79 s per loop
>>> pickle_file.close()
>>> pickle_file = open('pickle_foo', 'r')
>>> %timeit d = cPickle.load(pickle_file)
1 loops, best of 3: 2.03 s per loop
Но anydbm_file
вам нужно создать только один раз; тогда, открывая это снова почти мгновенно.
>>> %timeit anydbm_file = anydbm.open('anydbm_foo', 'r')
10000 loops, best of 3: 74.3 us per loop
Так что anydbm
имеет преимущество там. С другой стороны,
>>> %timeit for i in range(1, 1000): x = anydbm_file[str(i)]
100 loops, best of 3: 3.15 ms per loop
>>> %timeit for i in range(1, 1000): x = d[str(i)]
1000 loops, best of 3: 374 us per loop
Чтение ключа из anydbm_file
занимает в десять раз больше времени, чем чтение ключа из словаря в памяти. Вы должны были бы сделать много поисков для этой разницы, чтобы перевесить 5 секунд, необходимых для цикла засолки / выгрузки; но даже если вы этого не сделаете, разница во времени чтения здесь может привести к снижению производительности, в зависимости от того, что вы делаете.
Другими параметрами являются SQLite3
или (для отдельного процесса сервера базы данных, который допускает одновременное соединение нескольких процессов), psycopg2
+ PostgreSQL,