跳转到主要内容

在不创建中间对象的情况下对列数据进行高速计算。

项目描述

https://travis-ci.org/diana-hep/oamap.svg?branch=master

简介

数据分析师经常需要在速度和灵活性之间做出选择。例如,SQL表这样的表格数据可以快速处理以进行真正交互式的分析会话,但如JSON这样的层次嵌套格式更适合表示复杂数据模型中的关系。在某些领域(如粒子物理学),我们希望在类似JSON的结构上以SQL的速度进行计算。

在大型数据集上实现高吞吐量的关键是“列”式布局数据。一个属性的值应该在磁盘或内存上连续,因为数据是以局部连续块从一块缓存分页到另一块的。例如,ROOTParquet文件格式在磁盘上以列的形式表示类似JSON的数据,但这些数据通常被反序列化为对象以在内存中处理。通过在整个计算过程中保持列式结构,可以进一步提高性能(参见此演讲此论文)。

OAMap工具包在Python中实现了对象数组映射。对象数组映射,类似于对象关系映射(ORM),是概念对象与物理数组之间的一对一关系。您可以编写看起来像在普通Python对象(列表、元组、类实例)上操作的功能,但实际上它们是在低级、连续的缓冲区(Numpy数组)上执行。结果是快速处理大型、复杂的数据集,同时内存占用很小。

OAMap有两种主要模式:(1)纯Python对象代理,它们假装是Python对象,但实际上在需要时访问数组数据;(2)由Numba编译的字节码。纯Python形式适用于低延迟、探索性工作,而编译形式适用于高吞吐量。它们可以无缝互换:Python代理在进入Numba编译函数时转换为编译形式,并在离开时切换回来。例如,您可以在编译代码中进行快速搜索,并手动更全面地检查结果。

任何列式文件格式或数据库都可以用作数据源:OAMap可以从任何类似字典的对象(任何实现__getitem__的Python对象)获取数据数组,甚至可以在Numba编译函数内部这样做。包括对ROOT、Parquet和HDF5的支持,以及Python的shelve替代方案。存储和访问整个数据集(包括元数据),所需的底层结构不比一组命名数组多。(数据类型编码在名称中,值在数组中。)OAMap旨在作为文件格式和数据库之上的中间件层,但又在完全集成的分析套件之下。

安装

像安装其他Python包一样安装OAMap

pip install oamap --user

或类似(如果您愿意,可以使用sudovirtualenvconda)。

严格依赖项

推荐依赖项

  • Numba和LLVM用于JIT编译函数(需要LLVM的特定版本,请按照说明操作)

  • thriftpy用于读取Parquet文件(纯Python,pip即可)

  • uproot用于读取ROOT文件(纯Python,pip即可)

  • h5py用于读取HDF5文件(需要二进制库;请按照说明操作)

可选依赖项:(所有这些都是绑定到二进制文件的,可以通过包安装)

  • lz4压缩用于某些ROOT和Parquet文件

  • python-snappy压缩用于某些Parquet文件

  • lzo压缩用于某些Parquet文件

  • brotli压缩用于某些Parquet文件

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

oamap-0.12.4.tar.gz (68.3 kB 查看哈希

上传于

由以下支持