#python #linux #pickle #data-storage
#python #linux #рассол #хранилище данных
Вопрос:
Мне необходимо создать систему для хранения структур данных Python в системе Linux, но при этом иметь одновременный доступ на чтение и запись к данным из нескольких программ / демонов / скриптов. Моя первая мысль заключается в том, что я бы создал сокет unix, который прослушивал бы соединения и выдавал запрошенные данные в виде обработанных структур данных python. Любые записи клиентов будут синхронизированы с диском (возможно, в пакетном режиме, хотя я не ожидаю, что это будет высокая пропускная способность, поэтому, скорее всего, подойдет просто кэширование Linux vfs). Это гарантирует, что только один процесс считывает и записывает данные.
Другая идея заключается в том, чтобы просто сохранить обработанную структуру данных на диске и разрешить доступ только к одному процессу через файл блокировки или токен… Это требует, чтобы все обращающиеся клиенты соблюдали механизм блокировки / использовали модуль доступа.
Что я просматриваю? Доступен SQLite, но я бы хотел, чтобы это было как можно проще.
Что бы вы сделали?
Комментарии:
1. Что это за данные?
2. данные конфигурации; настройки для всех видов системных элементов.
3. Да, похоже, что SQLite будет самым простым способом и определенно более надежным, чем большинство самодельных программ.
Ответ №1:
Я бы просто использовал SQLite, если он доступен.
Смотрите этот FAQ:http://www.sqlite.org/faq.html#q5 — SQLite (с помощью pysqlite [0]) должен быть способен элегантно обрабатывать ваш параллелизм.
Вы можете сохранить данные в виде простых пар ключ-значение, если хотите, нет необходимости использовать весь BNF для ваших данных.
Ответ №2:
Если вы хотите просто сохранить пары имя / значение (например, имя файла в обработанные данные), вы всегда можете использовать Berkley DB (http://code.activestate.com/recipes/189060-using-berkeley-db-database /). Если ваши данные ориентированы на числа, вы можете захотеть проверить PyTables (http://www.pytables.org/moin ). Если вы действительно хотите использовать сокеты (обычно я бы старался избегать этого, поскольку вам приходится беспокоиться о множестве мелочей), вы можете захотеть взглянуть на Twisted Python (подходит для обработки нескольких подключений через Python без необходимости обработки потоков).
Ответ №3:
Я бы использовал базу данных. Настоящий. Вот почему они существуют (ну, одна из причин). Не изобретайте велосипед, если в этом нет необходимости.
Комментарии:
1. Это для встроенной системы — sqlite является единственным вариантом. Я пытаюсь избежать необходимости конвертировать мои объекты в реляционную базу данных, если это возможно
Ответ №4:
Если оставить в стороне внутреннее хранилище (здесь множество опций, включая ConfigParser, shelf, sqlite и anydbm), идея с одним процессом, обрабатывающим хранилище, и другими, подключающимися к нему, может быть полезной. Моя первая мысль для этого — Pyro (удаленные объекты Python). Сокеты, хотя и всегда доступны, могут быть сложными.
Комментарии:
1. Это выглядит захватывающе! Мне нужно будет разобраться — это чистый Python? (перекрестная компиляция модулей python на основе C — это настоящая боль)
Ответ №5:
Вы могли бы сериализовать структуры данных и сохранить их в виде значений с помощью ConfigParser
. Если бы вы создали свою собственную библиотеку / модуль access для доступа к данным, вы могли бы выполнить сериализацию в библиотеке, чтобы клиентский код просто отправлял и получал объекты python. Вы также могли бы обрабатывать параллелизм в библиотеке.