Какова наименее ресурсоемкая структура данных для распространения с приложением Python? - PullRequest
0 голосов
/ 20 мая 2009

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

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

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

Ответы [ 5 ]

6 голосов
/ 20 мая 2009

Стандартный модуль shelve предоставит вам постоянный словарь, который хранится в базе данных в стиле dbm. При условии, что ваши ключи являются строками, а ваши значения можно выбирать (так как вы уже используете pickle, это должно быть правдой), это может быть лучшим решением, если просто сохранить весь словарь в одном файле.

Пример:

>>> import shelve
>>> d = shelve.open('mydb')
>>> d['key1'] = 12345
>>> d['key2'] = value2
>>> print d['key1']
12345
>>> d.close()

Я бы также порекомендовал Дурус , но это потребует дополнительных знаний с вашей стороны. Это позволит вам создать PersistentDictionary. По памяти ключами может быть любой маринованный объект.

2 голосов
/ 20 мая 2009

Сколько памяти может разумно использовать ваше приложение? Это будет работать на рабочем столе каждого пользователя, или где-то будет только одно развертывание?

Словарь Python в памяти, безусловно, может справиться с двумя миллионами ключей. Вы говорите, что у вас есть подмножество данных; у тебя есть все? Может быть, вы должны бросить на него полный набор данных и посмотреть, справится ли он.

Я только что протестировал создание словаря с двумя миллионами записей; общее использование памяти для процесса составило около 200 МБ. Если ваша основная задача - скорость, и у вас есть свободное ОЗУ, вы, вероятно, не добьетесь большего успеха, чем словарь Python в памяти.

2 голосов
/ 20 мая 2009

Для быстрого поиска используйте стандартный модуль Python dbm (см. http://docs.python.org/library/dbm.html) для создания файла базы данных и поиска в нем. Формат файла dbm может быть не кроссплатформенным, поэтому вы можете вы хотите распространять ваши данные в формате Pickle или repr, JSON, YAML или XML и создавать базу данных dbm, в которой пользователь запускает вашу программу.

1 голос
/ 13 сентября 2009

См. Это решение на SourceForge, esp. документация "сноски":

модуль y_serial.py :: хранилище объектов Python с SQLite

"Сериализация + постоянство :: в несколько строк кода сжимают и аннотируют объекты Python в SQLite, а затем извлекают их в хронологическом порядке по ключевым словам без какого-либо SQL. Наиболее полезный" стандартный "модуль для базы данных для хранения данных без схемы . "

http://yserial.sourceforge.net

0 голосов
/ 20 мая 2009

Вот три вещи, которые вы можете попробовать:

  1. Сжать маринованный словарь с помощью zlib. pickle.dumps (ДИКТ) .encode ( "Zlib")
  2. Создайте свой собственный формат сериализации (не должен быть слишком сложным).
  3. Загрузка данных в базу данных sqlite.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...