有效加载或合并大小不等的元素集合的简单技巧
jagged的Python项目详细描述
高效存储相同类型、大小不均的阵列
jagged是一个正在进行的业余项目,探索存储全景图 对于包含(大量)具有相同类型的数组的数据集 列的数量,但行的数量不同。这样的例子 使用jagged的数据集是多变量的集合。 时间序列(短动物行为片段)和分子集合 (表示为可变长度的字符串)。
jagged旨在帮助批量分析笔记本和集群中的数据。 或者交互,提供一个非常轻量级的商店。锯齿状提供快速 检索包含数百万行的许多GB数据集的数组子集。
按设计约束
重点是快速检索任意批处理查询。
锯齿状存储仅附加。
没有事务、复制或分发。 它是本地或网络磁盘中的所有文件。
尚未作出重大努力来优化 (尽管有些后端工作非常顺利)。
目前,一切都是用纯python实现的简单算法。
安装
使用pip就足够了:
pip install jagged
jagged stores构建在几个高质量的python库之上:numpy、blosc, bloscpack、bcolz和joblib。它还需要whatami和python的未来。 测试依赖于pytest(您现在需要安装所有要测试的依赖项, 这很快就会改变)。
展示
使用锯齿很简单。有不同的实现提供 两个基本方法:append将新数组添加到存储,get检索 由数组在存储中的插入顺序标识的数组集合。
importos.pathasopimportnumpyasnpfromjagged.mmap_backendimportJaggedByMemmap# A Jagged instance is all you needjagged=JaggedByMemmap(op.expanduser(path='~/jagged-example/mmap'))# You can drop here any you want to# Generate a random datasetrng=np.random.RandomState(0)max_length=2000num_arrays=100originals=[rng.randn(rng.randint(0,max_length),50)for_inrange(num_arrays))# Add these to the store (context is usually optional but recommended)withjagged: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 roundtriproundtripped=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已经提供了以下存储后端 这可以被认为是有效和稳定的。其他的后端也在计划中。
Backend | comp | chunk | column | mmap | lin | lazy | cont |
---|---|---|---|---|---|---|---|
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 | ||||||
JaggedByPickle | X | X |
- comp:可以压缩
- chunk:可以分块
- column:连续存储数组的列(可以通过使用每列存储轻松实现)
- mmap:可以打开指向数据的memmap
- lin:可以检索任何行,而无需检索整个行
- 它包含的数组
- 惰性:数组不是立即获取的;这也意味着可以对它们进行管理
- 作为操作系统的虚拟内存(仅限jaggedbymmap)
- cont:检索到的数组可以强制位于连续的内存段中
基准
哪些后端和参数最有效取决于数据是否可压缩,以及 阵列的大小。我们很清楚什么对我们的数据最有效 提供一个基准框架。在这里找到preview。