Почему shelve.syn c не работает должным образом? - PullRequest
0 голосов
/ 15 апреля 2020

Почему shelve syn c второй ключ (world) в приведенном ниже примере? Я дважды вызываю метод sync, чтобы обновить данные - но он этого не делает - и при этом он не вызывает исключение. Это ожидаемое поведение? В общем, могу ли я рассчитывать на то, что syn c произойдет всегда ?

Я оценивал shelve как вариант, позволяющий сократить время загрузки моего приложения «в памяти» сохраняя состояние (глубоко вложенный объект) моего приложения.

Кроме того, кто-нибудь знает, какова временная сложность shelve.sync? Это O(delta), где detla - это изменения , произошедшие с глубоко вложенным объектом?

import shelve

example = {}

d = shelve.open("shelve.db", writeback=True)
d["example"] = example

example["hello"] = "hello"
d.sync()
example["world"] = "world"
d.sync()

d.close()

d = shelve.open("shelve.db", writeback=True)
print(d["example"]["hello"])
print(d["example"]["world"])

1 Ответ

1 голос
/ 16 апреля 2020

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

Shelf.sync() записывает все записи кэша обратно в файл на диске, и очищает кеш . Полка забывает обо всех найденных предметах. Дальнейшие изменения в d не будут отражены на полке, и если вы попытаетесь получить d["example"] снова после syn c, вы получите новый диктант, восстановленный с полки, вместо того, чтобы получить d.

Не похоже, что существует интерфейс c для синхронизации c изменений без очистки кэша.


Кроме того, sync перебирает каждую запись в кэш, независимо от того, что изменилось или не изменилось (он понятия не имеет), и записывает новые соленья обратно на диск. Однако это занимает много времени.

...