Python的快速键值磁盘存储



我想知道是否有一个带有Python绑定的快速磁盘键值存储,它支持数百万次对单独键的读/写调用。我的问题涉及到在一个非常大的语料库(维基百科(中计算单词的共现次数,并不断更新共现次数。这涉及到使用64位密钥和64位值读取和写入约3亿个值70次。

我还可以将我的数据表示为维度为~2M x 2M的上三角稀疏矩阵。

到目前为止,我已经尝试过:

  • Redis(64GB RAM不够大(
  • TileDB SparseArray(无法添加到值中(
  • Sqlite(速度太慢(
  • LMDB(批量处理3亿个读/写事务需要数小时才能执行(
  • Zarr(基于坐标的更新速度非常慢(
  • 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)

看看Plevel,它是LevelDB的python接口。

几年前我成功地使用了它,而且这两个项目似乎仍然活跃。我自己的用例是存储数以百万计的密钥:值对,我更关注读取性能,但它看起来也针对写入进行了优化。

PySpark在这里更有用。

PairFunction<String, String, String> keyData =
new PairFunction<String, String, String>() {
public Tuple2<String, String> call(String x) {
return new Tuple2(x.split(" ")[0], x);
}
};

JavaPairRDD<字符串,字符串>pairs=lines.mapToPair(keyData(;https://www.oreilly.com/library/view/learning-spark/9781449359034/ch04.html

最新更新