Skip to main content

Ultra fast persistent store for small states in mapped YAML file

Project description

PersistedState

Simple and fast solution for persisting small states:

from persistedstate import PersistedState

STATE = PersistedState("example.state", last_id=0)

for current_id in range(STATE.last_id + 1, 100_001):
    print(f"Processing item #{current_id}")
    STATE.last_id = current_id

print("Processing DONE.")

You can interrupt this script, and next time it will continue from the first unprocessed item. As another example see perftest.py.

Mapped YAML state file

The use case is persisting small amount of data which can be edited easily with a text editor. The database is an UTF-8 encoded YAML file, so it can be highlighted and edited manually if needed. (It also uses YAML stream file format for journal.) The YAML file is fully mapped to Python objects, so every change is synchronized to disk immediately. E.g. you can do this:

STATE = PersistedState("state.yaml", processed_items=[])
STATE.setdefault("key", {})
STATE["key"].setdefault("nested", 2)

STATE.processed_items.append("<some item>")
STATE["key"]["nested"] += 1

Failure tolerance

It uses Write-Ahead-Logging and atomic vacuum, so there will be no data loss.

Performance

For its use case it outperforms existing key-value store modules. For example incrementing a counter (for the details see perftest.py):

state.counter = 0
for _ in range(COUNT_TO):
    state.counter += 1

Counting to 10,000 (using Windows and Python 3.11):

PersistedState   0.193 sec
DiskCache        1.222 sec
SqliteDict       3.089 sec
PickleDb         8.251 sec
Lmdb            14.944 sec
Shelve          39.771 sec

The example seems to be silly, but this is very close to the use case it was developed for. For complex data structures or big amount of data I suggest using other libraries, like DiskCache. (The rule of thumb is when your state file is too big to be edited easily in your favorite text editor, you may think about using another key-value store library.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

persistedstate-23.5.tar.gz (5.3 kB view details)

Uploaded Source

Built Distribution

persistedstate-23.5-py3-none-any.whl (5.7 kB view details)

Uploaded Python 3

File details

Details for the file persistedstate-23.5.tar.gz.

File metadata

  • Download URL: persistedstate-23.5.tar.gz
  • Upload date:
  • Size: 5.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for persistedstate-23.5.tar.gz
Algorithm Hash digest
SHA256 3ea279142b910302256c15209dbd2e4af4525be94c0f71badfcb77de20dd5499
MD5 27b5f3f25145b8680990a33e19ae4ea7
BLAKE2b-256 0c2098a6fb93d789886690affb37eefe2debc051b9e5dcfc59f9f214d8a541ac

See more details on using hashes here.

File details

Details for the file persistedstate-23.5-py3-none-any.whl.

File metadata

File hashes

Hashes for persistedstate-23.5-py3-none-any.whl
Algorithm Hash digest
SHA256 1fe6651fdedf24b7a45ccd0394e1d9789775d09dfa2ac3cf8edafac1a898c368
MD5 a88fd75ff072307da0acc1fe687734a2
BLAKE2b-256 99815e1c21fef0399d47e313fa43199251bd60c18d94e58ecb90026f36f9fe2c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page