可追加的键值存储
项目描述
键值字节存储,具有可追加的值
Partd存储键值对。值是原始字节。我们在旧值上追加。
Partd在洗牌操作方面表现卓越。
操作
PartD有两个主要操作,追加和获取。
示例
创建一个由目录支持的Partd
>>> import partd >>> p = partd.File('/path/to/new/dataset/')
将键字节对追加到数据集
>>> p.append({'x': b'Hello ', 'y': b'123'}) >>> p.append({'x': b'world!', 'y': b'456'})
获取与键关联的字节
>>> p.get('x') # One key b'Hello world!' >>> p.get(['y', 'x']) # List of keys [b'123456', b'Hello world!']
销毁partd数据集
>>> p.drop()
就这些。
实现
我们可以通过内存字典来备份部分数据
>>> p = Dict()
对于大量数据或需要在进程间共享数据,我们通过文件目录来备份部分数据。这使用基于文件的锁来实现一致性。
>>> p = File('/path/to/dataset/')
然而,这可能在许多小写入操作中失败。在这些情况下,您可能希望用一个部分数据备份另一个,保持缓冲部分数据中固定最大量的数据。当空间不足时,这将把第一个部分数据中较大的元素写入第二个部分数据。
>>> p = Buffer(Dict(), File(), available_memory=2e9) # 2GB memory buffer
您可能还想让许多分布式进程一致地写入单个部分数据。这可以通过服务器来实现。
服务器进程
>>> p = Buffer(Dict(), File(), available_memory=2e9) # 2GB memory buffer >>> s = Server(p, address='ipc://server')
工作进程
>>> p = Client('ipc://server') # Client machine talks to remote server
编码和压缩
一旦我们能够稳健且高效地向部分数据追加字节,我们就考虑压缩和编码。这通常可以通过Encode
部分数据来实现,它接受三个函数,一个用于写入时应用,一个用于读取时应用,一个用于连接字节流。对于常见的数据和压缩格式,已经存在一些常见的配置。
我们希望在与部分数据交互时透明地压缩和解压缩数据。例如BZ2
、Blosc
、ZLib
和Snappy
等对象存在,并将另一个部分数据作为参数。
>>> p = File(...) >>> p = ZLib(p)
它们的工作方式与之前完全一样,压缩和解压缩是自动发生的。
Python列表、NumPy数组和Pandas数据框等常见数据格式也支持即用。
>>> p = File(...) >>> p = NumPy(p) >>> p.append({'x': np.array([...])})
这让我们可以忘记字节,而是以我们正常的数据类型进行思考。
组合
原则上,我们想要将这些选择组合在一起
写入策略:
Dict
、File
、Buffer
、Client
编码:
Pickle
、Numpy
、Pandas
、…压缩:
Blosc
、Snappy
、…
部分数据对象通过嵌套组合。在这里,我们创建一个部分数据,它将pickle编码的BZ2压缩字节直接写入磁盘
>>> p = Pickle(BZ2(File('foo')))
我们可以构建更复杂的系统,包括压缩、序列化、缓冲和远程访问。
>>> server = Server(Buffer(Dict(), File(), available_memory=2e0)) >>> client = Pickle(Snappy(Client(server.address))) >>> client.append({'x': [1, 2, 3]})
项目详情
下载文件
下载您平台上的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。