доступ к словарю из разных программ - PullRequest
2 голосов
/ 16 февраля 2012

Я создаю словарь из большого файла.

def make_dic():
    big_dic={}
    for foo in open(bar):
           key,value=do_something(foo)
           big_dic[key]=value
def main():
    make_dic() #this takes time

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

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Это не будет работать для всех ситуаций, которые соответствуют вашему описанию, но 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,

3 голосов
/ 16 февраля 2012

Самый простой способ сделать словарь с постоянными строками ключей и значений - это модуль Python anydbm. Вы можете в основном создать файл, который действует как словарь, отображающий строки в строки.

...