?

Log in

No account? Create an account

(n)dbm под Python - Узором созвездий по мантии ночи

08.02.2016, Понедельник

16:09:00 - (n)dbm под Python

Previous Entry Поделиться Next Entry

Нужно мне иметь небольшой файлик данных, вполне достаточно формата ключ-значение.
Ставить ради этого какую-то "серьёзную" базу данных лениво и вряд ли нужно. И sqlite не хочется, потому что лишний слой sql-запросов мне тут нафиг не нужен.
Дикого быстродействия не требуется.
Но и просто вариант текстового файла, перезаписываемого каждый раз целиком, думаю, уже не годится.
Смотрю, что есть в питоне... dbm, gdbm, bsddb (и dbhash поверх него).
В простейшем случае, наверное, можно брать что угодно.
Но всё же, есть ли какие соображения за/против?

This entry was originally posted at http://arilou.dreamwidth.org/981693.html. Please comment there using OpenID.

Comments:

[User Picture]
From:vitus_wagner
Date:08.02.2016 13:30:59
(Link)
Я обычно в таких случаях использую anydbm. И пускай сonfigure разбирается какая там реализация должна снизу лежать на данной платформе.

Но если файлик действительно небольшой и не требует конкурентного доступа,
используй лучше pickle или marshal.


Еще вариант - вообще никаких модулей не использовать, а тупо делать

для записи

f.write(repr(dict))


А для чтения
dict=eval(f.read())

Метод хорош тем, что можно файлик в текстовом редакторе поредактировать в случае надобности.

А то еще можно для записи модуль pprint использовать.
(Ответить) (Thread)
[User Picture]
From:cmike
Date:08.02.2016 13:44:14
(Link)
Еще вариант - вообще никаких модулей не использовать, а тупо делать
Я бы сказал, что это единственный вариант, при этой постановке вопроса и с разумными дефолтами. :)
(Ответить) (Parent) (Thread)
[User Picture]
From:kzn
Date:08.02.2016 13:36:50
(Link)
Как вариант можно посмотреть на всякие leveldb
(Ответить) (Thread)
[User Picture]
From:vitus_wagner
Date:08.02.2016 13:37:13
(Link)
Да, в конце прошлого века я полагал, что размер файла, начиная с которого
"вариант текстового файла, перезаписываемого каждый раз целиком уже не годится", это 6 мегабайт.

Сейчас, почти два десятилетия спустя, можно, наверное поднять планку минимум на порядок.
(Ответить) (Thread)
[User Picture]
From:phd
Date:08.02.2016 14:54:01

Медленные диски

(Link)
Опустить на порядок или два в связи с широким распространением ноутбуков.
(Ответить) (Parent) (Thread)
[User Picture]
From:arilou
Date:08.02.2016 15:00:37

Re: Медленные диски

(Link)
Это крутится на сервере. Но сервер, конечно же, много чем другим бывает занят в то же время (скажем, поднимает несклько виртуалок и тестирует на них свежесобранный сервер некоего приложения).
(Ответить) (Parent) (Thread)
[User Picture]
From:vitus_wagner
Date:08.02.2016 17:21:39

Re: Медленные диски

(Link)
Ну по сравнению с гигабайтами виртуалок, десяток-другой мегабайт твоего файла это та-а-кие копейто.
(Ответить) (Parent) (Thread)
[User Picture]
From:vitus_wagner
Date:08.02.2016 17:17:05

Re: Медленные диски

(Link)
По сравнению с теми узкими скази, которые были в 97 году у Sparc IPC, диски современных ноутбуков просто реактивные.
(Ответить) (Parent) (Thread)
[User Picture]
From:cmike
Date:08.02.2016 13:49:36
(Link)
Какое ориентировочное число записей и как часто запускается программа (в смысле, несколько/много раз в секунду или реже).
(Ответить) (Thread)
[User Picture]
From:arilou
Date:08.02.2016 14:59:18
(Link)
Программа запускается нечасто.
В процессе работы может неоднократно обновлять записи (значения по ключам).
Вот мне, собственно, и подумалось, что полная перезапись файла каждый раз -- это многовато.
Хотя, возможно, я тут выгадываю несущественные крохи?
(Ответить) (Parent) (Thread)
[User Picture]
From:tim_caper
Date:08.02.2016 15:37:29
(Link)
При фиксированном размере записи можно (хотя бы иногда) перезаписывать отдельную запись, а не весь файл
(Ответить) (Parent) (Thread)
[User Picture]
From:cmike
Date:08.02.2016 15:39:01
(Link)
Непонятно, что мешает обращаться в хеш, а сохранять его в конце работы. Сценариев такого придумать несложно, но в постановке на них нет и намека.

Я бы сказал — сделать (реализации записи хеша вопрос буквально минут) и если скорость не устраивает — причем не устраивает в буквальном смысле "видно, что работает медленно" — думать об оптимизации.

На самом деле, даже если бд была бы нужна, я бы все равно реализовал через хеш. Отлаживаться проще и возится с базой можно уже тогда, когда основная функциональность работает.
(Ответить) (Parent) (Thread)
[User Picture]
From:arilou
Date:08.02.2016 15:04:33
(Link)
OK, я, кажется, придумал, как мне по-простому это всё сделать, и, действительно, dbm тут мне не нужен.
(А, кстати, вообще бывают ли сейчас ситуации, когда он нужен, т.е. когда просто текстовый файл уже не катит, а нормальная база ещё слишком громоздка для задачи?)
(Ответить) (Parent) (Thread)
[User Picture]
From:cmike
Date:08.02.2016 15:41:59
(Link)
Если не в эмбеддед? ;)
Реализация полнотекстового поиска, например, с реляционными базами работает плохо. И получается громоздкая конструкия, которая еще и задачу выполнить не дает.
(Ответить) (Parent) (Thread)
[User Picture]
From:vitus_wagner
Date:08.02.2016 17:18:57
(Link)
Когда нужен словарь, разделяемый между многими процессами.
(Ответить) (Parent) (Thread)
[User Picture]
From:eleyvie
Date:08.02.2016 21:56:39
(Link)
Можно shelve глянуть.
(Ответить) (Thread)
[User Picture]
From:phd
Date:08.02.2016 22:18:58
(Link)
У shelve внутри вышеупомянутый anydbm.
(Ответить) (Parent) (Thread)