有效加载或合并大小不均匀元素集合的简单技巧
项目描述
高效存储相同类型、大小不一的数组
Jagged是一个正在进行的业余项目,探索包含(大量)具有相同类型和列数但行数不同的数组的数据集的存储全景。使用jagged的此类数据集的示例是多变量时间序列的集合(短的动物行为片段)和分子的集合(表示为不同长度的字符串)。
Jagged 旨在帮助分析笔记本电脑和集群中的数据,以批量或交互方式,提供非常轻量级的存储。Jagged 为包含数百万行的许多 GB 数据集提供了数组子集的快速检索。
设计约束
重点是快速检索任意批处理查询。
锯齿状商店仅追加。
没有事务、复制或分发。它是本地或网络磁盘中的所有文件。
尚未做出重要的优化工作(尽管一些后端工作得相当顺利)。
目前,一切都是用纯 python 实现的简单算法。
安装
使用 pip 就足够了:
pip install jagged
Jagged stores 建立在几个高质量的 python 库之上:numpy、blosc、bloscpack、bcolz 和 joblib。它还需要whatami和python-future。测试依赖于pytest(你需要安装所有依赖项来测试,这很快就会改变)。
展示柜
使用锯齿状很简单。有不同的实现提供了两种基本方法:append将一个新数组添加到存储中,get检索由它们在存储中的插入顺序标识的数组集合。
import os.path as op
import numpy as np
from jagged.mmap_backend import JaggedByMemmap
# A Jagged instance is all you need
jagged = JaggedByMemmap(op.expanduser(path='~/jagged-example/mmap'))
# You can drop here any you want to
# Generate a random dataset
rng = np.random.RandomState(0)
max_length = 2000
num_arrays = 100
originals = [rng.randn(rng.randint(0, max_length), 50)
for _ in range(num_arrays))
# Add these to the store (context is usually optional but recommended)
with jagged:
indices = map(jagged.append, originals)
# What do we have in store?
print('Number of arrays: %d, number of rows: %d' % (jbmm.narrays, jbmm.nrows))
print('Jagged shape=%r, dtype=%r, order=%r' %
(jagged.shape, jagged.dtype, jagged.order))
# Check roundtrip
roundtripped = jagged.get(indices)
print('The store has %d arrays')
# Jagged stores self-identified themselves (using whatami)
print(jagged.what().id())
# Jagged stores can be iterated in chunks
# See iter
# Jagged stores can be populated from other jagged stores
# Some jagged stores allow to retrieve arbitrary rows as fast
# as arbitrary arrays.
后端
虽然变化很快,但jagged已经提供了以下可以被认为是工作和稳定的存储后端。其他后端正在计划中。
后端 |
补偿 |
块 |
柱子 |
地图 |
林 |
懒惰的 |
续 |
|---|---|---|---|---|---|---|---|
JaggedByBlosc |
X |
X |
|||||
JaggedByCarray |
X |
X |
X |
X |
|||
JaggedByH5Py |
X |
X |
X |
X |
X |
||
JaggedByJoblib |
X |
X |
|||||
JaggedByMemMap |
X |
X |
X |
X |
|||
JaggedByNPY |
|||||||
JaggedByBloscpack |
X |
||||||
锯齿状泡菜 |
X |
X |
comp:可以压缩
chunk:可以分块
column:连续存储数组的列(可以通过使用每列存储轻松实现)
mmap:可以打开数据的memmap
- lin:可以检索任何行而不需要检索整个
它包含它的数组
- 惰性:不会立即获取数组;这也意味着它们可以被管理
作为操作系统的虚拟内存(仅限 JaggedByMemMap)
续:可以强制检索到的数组位于连续的内存段中
基准
哪种后端和参数效果最好取决于您的数据是否可压缩以及数组的大小。我们很清楚什么最适合我们的数据,并且正在努力提供基准测试框架。在这里找到预览。