Simple File-based KV-Store
Project description
# kvfile
[](https://travis-ci.org/akariv/kvfile)
[](https://coveralls.io/r/akariv/kvfile?branch=master)
A simple Key-Value store that's file based - so can accommodate large data sets with a small memory footprint.
Internally will use the faster `leveldb` as a storage backend or `sqlite3` as fallback if `leveldb` is not available.
## The Basics
The API should feel familiar to anyone working with Python.
It exposes `get`, `keys` and `items` for reading from the DB, and `set` for setting a value in the DB.
### Initializing
```python
import datetime
import decimal
from kvfile import KVFile
kv = KVFile()
```
### Setting values
```python
kv.set('s', 'value')
kv.set('i', 123)
kv.set('d', datetime.datetime.fromtimestamp(12325))
kv.set('n', decimal.Decimal('1234.56'))
kv.set('ss', set(range(10)))
kv.set('o', dict(d=decimal.Decimal('1234.58'),
n=datetime.datetime.fromtimestamp(12325)))
```
### Getting values
```python
assert kv.get('s') == 'value'
assert kv.get('i') == 123
assert kv.get('d') == datetime.datetime.fromtimestamp(12325)
assert kv.get('n') == decimal.Decimal('1234.56')
assert kv.get('ss') == set(range(10))
assert kv.get('o') == dict(d=decimal.Decimal('1234.58'),
n=datetime.datetime.fromtimestamp(12325))
```
### Listing values
`keys()` and `items()` methods return a generator yielding the values for efficient stream processing.
The returned data is sorted ascending (by default) based on the keys
```python
assert list(kv.keys()) == ['d', 'i', 'n', 'o', 's', 'ss']
assert list(kv.items()) == [
('d', datetime.datetime.fromtimestamp(12325)),
('i', 123),
('n', decimal.Decimal('1234.56')),
('o', {'d': decimal.Decimal('1234.58'),
'n': datetime.datetime.fromtimestamp(12325)}),
('s', 'value'),
('ss', {0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
]
```
Set the `reverse` argument to True for the `keys()` and `items()` methods to sort in descending order.
### Bulk inserting data
The SQLite DB backend can be very slow when bulk inserting data. You can use the insert method to insert efficiently in bulk.
```python
kv.insert(((str(i), ':{}'.format(i)) for i in range(50000)))
```
The batch size is 1000 by default, you should modify it depending on the size of your data and available memory.
```python
kv.insert(((str(i), ':{}'.format(i)) for i in range(50000)), batch_size=40000)
```
If you are inserting data from a generator and need to use the inserted data, use `insert_generator` method:
```python
for key, value in kv.insert_generator(((str(i), ':{}'.format(i)) for i in range(50)), batch_size=10):
print(key, value)
```
## Installing leveldb
On Debian based Linux:
```bash
$ apt-get install libleveldb-dev libleveldb1
```
On Alpine based Linux:
```bash
$ apk --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --update add leveldb leveldb-dev
```
On OS X:
```bash
$ brew install leveldb
```
[](https://travis-ci.org/akariv/kvfile)
[](https://coveralls.io/r/akariv/kvfile?branch=master)
A simple Key-Value store that's file based - so can accommodate large data sets with a small memory footprint.
Internally will use the faster `leveldb` as a storage backend or `sqlite3` as fallback if `leveldb` is not available.
## The Basics
The API should feel familiar to anyone working with Python.
It exposes `get`, `keys` and `items` for reading from the DB, and `set` for setting a value in the DB.
### Initializing
```python
import datetime
import decimal
from kvfile import KVFile
kv = KVFile()
```
### Setting values
```python
kv.set('s', 'value')
kv.set('i', 123)
kv.set('d', datetime.datetime.fromtimestamp(12325))
kv.set('n', decimal.Decimal('1234.56'))
kv.set('ss', set(range(10)))
kv.set('o', dict(d=decimal.Decimal('1234.58'),
n=datetime.datetime.fromtimestamp(12325)))
```
### Getting values
```python
assert kv.get('s') == 'value'
assert kv.get('i') == 123
assert kv.get('d') == datetime.datetime.fromtimestamp(12325)
assert kv.get('n') == decimal.Decimal('1234.56')
assert kv.get('ss') == set(range(10))
assert kv.get('o') == dict(d=decimal.Decimal('1234.58'),
n=datetime.datetime.fromtimestamp(12325))
```
### Listing values
`keys()` and `items()` methods return a generator yielding the values for efficient stream processing.
The returned data is sorted ascending (by default) based on the keys
```python
assert list(kv.keys()) == ['d', 'i', 'n', 'o', 's', 'ss']
assert list(kv.items()) == [
('d', datetime.datetime.fromtimestamp(12325)),
('i', 123),
('n', decimal.Decimal('1234.56')),
('o', {'d': decimal.Decimal('1234.58'),
'n': datetime.datetime.fromtimestamp(12325)}),
('s', 'value'),
('ss', {0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
]
```
Set the `reverse` argument to True for the `keys()` and `items()` methods to sort in descending order.
### Bulk inserting data
The SQLite DB backend can be very slow when bulk inserting data. You can use the insert method to insert efficiently in bulk.
```python
kv.insert(((str(i), ':{}'.format(i)) for i in range(50000)))
```
The batch size is 1000 by default, you should modify it depending on the size of your data and available memory.
```python
kv.insert(((str(i), ':{}'.format(i)) for i in range(50000)), batch_size=40000)
```
If you are inserting data from a generator and need to use the inserted data, use `insert_generator` method:
```python
for key, value in kv.insert_generator(((str(i), ':{}'.format(i)) for i in range(50)), batch_size=10):
print(key, value)
```
## Installing leveldb
On Debian based Linux:
```bash
$ apt-get install libleveldb-dev libleveldb1
```
On Alpine based Linux:
```bash
$ apk --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --update add leveldb leveldb-dev
```
On OS X:
```bash
$ brew install leveldb
```
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
kvfile-0.0.6.tar.gz
(7.0 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kvfile-0.0.6.tar.gz.
File metadata
- Download URL: kvfile-0.0.6.tar.gz
- Upload date:
- Size: 7.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.27.0 CPython/3.6.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
afcf33a4221e2458bd766093f3dddac9b4dc498771fc48fe74c2bfde99b96599
|
|
| MD5 |
31c173f47d77a9865896ee82c4c0c0a4
|
|
| BLAKE2b-256 |
ee3eb74769bd246fe16c4eaf9a44e22a1926b96ca662d379837dc670023426db
|
File details
Details for the file kvfile-0.0.6-py2.py3-none-any.whl.
File metadata
- Download URL: kvfile-0.0.6-py2.py3-none-any.whl
- Upload date:
- Size: 5.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.0 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.27.0 CPython/3.6.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93763399861b206da681621d7aaf116c21a2921925fcf2299228afc6930e8ebe
|
|
| MD5 |
296cb0729b9e3b864c06fbf2a7a70408
|
|
| BLAKE2b-256 |
1dd5859df9ee98de2f93cccef32a9a2539a13ea74d5f6c0a185bbc42f4383a10
|