| |
| from pathlib import Path |
| from typing import Union |
|
|
| from .base import BaseStorageBackend |
|
|
|
|
| class LmdbBackend(BaseStorageBackend): |
| """Lmdb storage backend. |
| |
| Args: |
| db_path (str): Lmdb database path. |
| readonly (bool): Lmdb environment parameter. If True, disallow any |
| write operations. Defaults to True. |
| lock (bool): Lmdb environment parameter. If False, when concurrent |
| access occurs, do not lock the database. Defaults to False. |
| readahead (bool): Lmdb environment parameter. If False, disable the OS |
| filesystem readahead mechanism, which may improve random read |
| performance when a database is larger than RAM. Defaults to False. |
| **kwargs: Keyword arguments passed to `lmdb.open`. |
| |
| Attributes: |
| db_path (str): Lmdb database path. |
| """ |
|
|
| def __init__(self, |
| db_path, |
| readonly=True, |
| lock=False, |
| readahead=False, |
| **kwargs): |
| try: |
| import lmdb |
| except ImportError: |
| raise ImportError( |
| 'Please run "pip install lmdb" to enable LmdbBackend.') |
|
|
| self.db_path = str(db_path) |
| self.readonly = readonly |
| self.lock = lock |
| self.readahead = readahead |
| self.kwargs = kwargs |
| self._client = None |
|
|
| def get(self, filepath: Union[str, Path]) -> bytes: |
| """Get values according to the filepath. |
| |
| Args: |
| filepath (str or Path): Here, filepath is the lmdb key. |
| |
| Returns: |
| bytes: Expected bytes object. |
| |
| Examples: |
| >>> backend = LmdbBackend('path/to/lmdb') |
| >>> backend.get('key') |
| b'hello world' |
| """ |
| if self._client is None: |
| self._client = self._get_client() |
|
|
| filepath = str(filepath) |
| with self._client.begin(write=False) as txn: |
| value_buf = txn.get(filepath.encode('ascii')) |
| return value_buf |
|
|
| def get_text(self, filepath, encoding=None): |
| raise NotImplementedError |
|
|
| def _get_client(self): |
| import lmdb |
|
|
| return lmdb.open( |
| self.db_path, |
| readonly=self.readonly, |
| lock=self.lock, |
| readahead=self.readahead, |
| **self.kwargs) |
|
|
| def __del__(self): |
| if self._client is not None: |
| self._client.close() |
|
|