python - 用于 Python 的快速键值磁盘存储
问题描述
我想知道是否有一个带有 Python 绑定的快速磁盘键值存储,它支持数百万次对单独键的读/写调用。我的问题涉及在一个非常大的语料库(维基百科)中计算单词共现,并不断更新共现计数。这涉及使用 64 位密钥和 64 位值读取和写入约 3 亿个值 70 次。
我还可以将我的数据表示为尺寸约为 2M x 2M 的上三角稀疏矩阵。
到目前为止,我已经尝试过:
- Redis(64GB RAM 不够大)
- TileDB SparseArray(无法添加到值)
- Sqlite(太慢了)
- LMDB(批量处理 3 亿次读/写事务需要多个小时才能执行)
- Zarr(基于坐标的更新非常慢)
- Scipy .npz(不能将矩阵保存在内存中以供添加部分使用)
- 带有memmapped坐标和数据的稀疏COO(添加矩阵时RAM使用量很大)
目前唯一运行良好的解决方案是 LMDB,但运行时间约为 12 天,这似乎不合理,因为我感觉我处理的数据不多。使用 .npz 将子矩阵(约 300M 值)保存到磁盘几乎是即时的。
有任何想法吗?
解决方案
你可能想看看我的项目。
pip install rocksdict
这是一个基于 RockDB 的快速磁盘键值存储,它可以将任何 python 对象作为值。我认为它可靠且易于使用。它的性能与 GDBM 相当,但与仅适用于 Linux 上的 python 的 GDBM 相比,它是跨平台的。
https://github.com/Congyuwang/RocksDict
下面是一个演示:
from rocksdict import Rdict, Options
path = str("./test_dict")
# create a Rdict with default options at `path`
db = Rdict(path)
db[1.0] = 1
db[1] = 1.0
db["huge integer"] = 2343546543243564534233536434567543
db["good"] = True
db["bad"] = False
db["bytes"] = b"bytes"
db["this is a list"] = [1, 2, 3]
db["store a dict"] = {0: 1}
import numpy as np
db[b"numpy"] = np.array([1, 2, 3])
import pandas as pd
db["a table"] = pd.DataFrame({"a": [1, 2], "b": [2, 1]})
# close Rdict
db.close()
# reopen Rdict from disk
db = Rdict(path)
assert db[1.0] == 1
assert db[1] == 1.0
assert db["huge integer"] == 2343546543243564534233536434567543
assert db["good"] == True
assert db["bad"] == False
assert db["bytes"] == b"bytes"
assert db["this is a list"] == [1, 2, 3]
assert db["store a dict"] == {0: 1}
assert np.all(db[b"numpy"] == np.array([1, 2, 3]))
assert np.all(db["a table"] == pd.DataFrame({"a": [1, 2], "b": [2, 1]}))
# iterate through all elements
for k, v in db.items():
print(f"{k} -> {v}")
# batch get:
print(db[["good", "bad", 1.0]])
# [True, False, 1]
# delete Rdict from dict
del db
Rdict.destroy(path)
推荐阅读
- python - Pandasql 查询数据帧列表或字典
- ajax - Visual Studio 中的 Polymer 3.0 使用 Iron-ajax 进行休息调用
- android - 如何向此代码段添加成功和失败处理程序?
- c++ - Maze Traversal 打印每条可能的路径 C++
- r - R:如果该组中的一个值低于某个阈值,则为整个组创建一个 0 或 1 的标志
- c++ - 为什么编译器更喜欢 f(const void*) 而不是 f(const std::string &)?
- c# - 某些服务器的 C# WebClient 异常
- javascript - 在不同的文件中打开 SQLite3?
- linux - Pyinstaller 和 xdg-open
- mysql - mysql父/子加入