Skip to main content

SaveState - persistent storage of arbitrary python objects

Project description

SaveState - persistent storage of arbitrary python objects

SaveState is meant to be a cross-platform fast file storage for arbitrary python objects, like python's shelve module. It is mostly a rewrite of semidbm2, but with more mapping-like functions, a context manager, and the aforementioned support for arbitrary python objects.

Implementation details:

  • Pure python
  • No requirements or dependencies
  • A dict-like interface (no unions)
  • Same, single file on windows and linux (unlike shelve)
  • Key and value integrity can be evaluated with a checksum, which will detect data corruption on key access.
  • Recovery from missing bytes at the end of the file, or small amounts of corrupted data in the middle
  • Both values AND keys put in savestate must support pickling. Note the security implications of this!
    • This means that you can use arbitrary objects as keys if they support pickle (unlike shelve)
  • All the keys of the savestate are kept in memory, which limits the savestate size (not a problem for most applications)
  • NOT Thread safe, so cannot be accessed by multiple processes
  • File is append-only, so the more non-read operations you do, the more the file size is going to balloon
    • However, you can compact the savestate, usually on savestate.close(), which will replace the savestate with a new file with only the current non-deleted data. This will impact performance a little, but not by much

Performance:

  • About 50-60% of the performance of shelve with gdbm (linux), but >5000% compared to shelve with dumbdbm (windows) (>20000% for deletes!)
    • Performance is more favorable with large keys and values when compared to gdbm, but gdbm is still faster on subsequent reads/writes thanks to its caching
  • A dbm-mode for about double the speed of regular mode, but only string-type keys and values
    • This is about 25-30% of the performance of gdbm on its own.
    • Note: Values will be returned in bytes form!

Source code includes a benchmark that you can run to get more accurate performance on your specific machine.

Using SaveState:

Use with open and close:

>>> import savestate
>>> 
>>> # Open savestate
>>> state = savestate.open("savestate", "c")
>>> 
>>> # Add data to savestate
>>> state["foo"] = "bar"
>>> 
>>> # Get data from savestate
>>> print(state["foo"])
bar

>>> # Delete data from savestate
>>> del state["foo"]
>>> 
>>> # Close the savestate
>>> state.close()

Use as a context manager:

>>> with savestate.open("filename.savestate", "c") as state:   
>>>     state["foo"] = "baz"                                                   
>>>     ...

Documentation:

savestate.open(filename, flag="r", verify_checksums=False, compact=False, dbm_mode=False)
  • filename: str - The name of the savestate. Will have the '.savestate' file extension added to it if it doesn't have it.
  • flag: Literal["r", "w", "c", "n"] - Specifies how the savestate should be opened.
    • "r" = Open existing savestate for reading only (default).
    • "w" = Open existing savestate for reading and writing.
    • "c" = Open savestate for reading and writing, creating it if it does not exist.
    • "n" = Always create a new, empty savestate, open for reading and writing.
  • verify_checksum: bool - Verify that the checksum for a key and value pair is correct on every __getitem__ call
  • compact: bool - Indicate whether to compact the savestate before closing it. No effect in read only mode.
  • dbm_mode: bool - Operate in dbm mode. This is faster, but only allows strings for keys and values.

'Read-Only' mode:

>>> # Magic methods
>>> savestate[key]
>>> key in savestate
>>> len(savestate)
>>> iter(savestate)
>>> reversed(savestate)
>>> str(savestate)
>>> repr(savestate)
>>>
>>> # Properties
>>> savestate.filepath  # absolute path (& filename)
>>> savestate.filename  # filename (& extension)
>>> savestate.isopen
>>>
>>> # Mapping-like methods
>>> savestate.keys()
>>> savestate.values()
>>> savestate.items()
>>> savestate.get(key: Any, default: Any = None)
>>>
>>> # Special methods
>>> savestate.close()
>>> ### Closes the savestate. Accessing keys after this 
>>> ### will cause an AttributeError.

'Read-Write', 'Create' and 'New' modes:

  • Extend read-only mode with these methods
>>> # Magic methods
>>> savestate[key] = value
>>> del savestate[key]
>>> 
>>> # Mapping-like methods
>>> savestate.pop(key: Any, default: Any = None)
>>> savestate.popitem()
>>> savestate.clear()
>>> savestate.setdefault(key: Any, default: Any = None)
>>> savestate.update(other: Mapping[Any, Any], **kwargs: Any)
>>> savestate.copy(new_filename: str)
>>> ### AssertionError if new filename is same as current one.
>>> ### THIS WILL OVERWRITE ANY FILES WITH THE GIVEN FILENAME!
>>> ### Note: new filename will have '.savestate' added to it, 
>>> ### if it doesn't have it
>>>
>>> # Special methods
>>> savestate.sync()
>>> ### Flushes existing data buffers and ensures that data
>>> ### is written to the disk. Always called on savestate.close()
>>> savestate.compact()
>>> ### Rewrite the contents of the files, which will
>>> ### reduce the size of the file due to implementation details
>>> savestate.close(compact: bool = False)
>>> ### Setting compact=True will compact the savestate
>>> ### even if it was not set so at savestate.open()

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

savestate-0.0.2.tar.gz (16.7 kB view details)

Uploaded Source

Built Distribution

savestate-0.0.2-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file savestate-0.0.2.tar.gz.

File metadata

  • Download URL: savestate-0.0.2.tar.gz
  • Upload date:
  • Size: 16.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.1 setuptools/54.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for savestate-0.0.2.tar.gz
Algorithm Hash digest
SHA256 afe6e6f79b5ce9c232c583e4505ec84b60edbfbb5c4828da8b05e518bcb58112
MD5 18ae6e4af512d4d8fed9d5dadcef4ced
BLAKE2b-256 e2597e4ecdc06c516dd4cf0f7505f266e85c4392c2847e1edbfae58711b689ba

See more details on using hashes here.

File details

Details for the file savestate-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: savestate-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.25.1 setuptools/54.0.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.9.0

File hashes

Hashes for savestate-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 db936cbe6ebea0f4d31742bdc6663344a9e5cf36c5ced2af5919bd5fac7be3c8
MD5 3fb83c28157ade4aba46e596464967a7
BLAKE2b-256 84f83baa727f3d140aa82008ca813e2129dd9f1bd083ffeb3f24a56afc58ea80

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