在不创建中间对象的情况下对列数据执行高速计算。
oamap的Python项目详细描述
简介
数据分析员经常面临速度和灵活性之间的选择。对于真正的交互式分析会话,可以足够快速地处理表格式数据(如sql表),但层次嵌套格式(如json)更擅长在复杂的数据模型中表示关系。在某些领域(如粒子物理),我们希望以sql的速度对类json结构执行计算。在大型数据集上实现高吞吐量的关键是在“列”中布局数据,特别是那些具有比单次访问更多属性的数据集。属性的所有值都应该在磁盘或内存上连续,因为数据在本地连续块中从一个缓存分页到下一个缓存。ROOT和Parquet文件格式表示磁盘列中类似json的数据,但这些数据通常反序列化为对象,以便在内存中处理。通过在计算的所有阶段(参见this talk和this paper)保持柱状结构,可以获得更高的性能。
oamap工具包在python中实现了一个对象数组映射。与对象关系映射(orms)类似,对象数组映射是概念对象和物理数组之间的一对一关系。您可以编写看似在普通python对象(列表、元组、类实例)上运行,但实际上在低级别连续缓冲区(numpy数组)上运行的函数。其结果是快速处理具有低内存占用的大型复杂数据集。
OAMap有两种主要模式:(1)纯Python对象代理,它假装为Python对象,实际上按需访问数组数据,(2)由^ {A6}编译的裸金属字节码。纯python表单适合于低延迟、探索性工作,而编译的表单适合于高吞吐量。它们可以无缝地互换:python代理在进入numba编译函数时转换为编译后的形式,在离开时切换回原来的形式。例如,您可以在编译后的代码中进行快速搜索,并手动更全面地检查结果。
任何列文件格式或数据库都可以用作数据源:oamap可以从任何dict类对象(实现__getitem__的任何python对象)获取数据数组,甚至可以从numba编译函数中获取。包括根、拼花和hdf5的后端,以及pythonshelve替代方案。存储和访问一个完整的数据集(包括元数据)只需要一个命名数组的集合。(数据类型以名称和数组中的值进行编码。)OAMAP旨在用作文件格式和数据库之上的中间件层,但位于完全集成的分析套件之下。
安装
像任何其他python包一样安装oamap:
pip install oamap --user
或类似的(如果愿意,可以使用sudo、virtualenv或conda)。
严格依赖项:
推荐依赖项:
- Numba and LLVM到jit编译函数(需要特定版本的llvm,请遵循说明)
- thriftpy读取拼花文件(纯python,pip很好)
- uproot读取根文件(纯python,pip很好)
- h5py读取hdf5文件(需要二进制库;遵循说明)
可选依赖项:(都是绑定到可以安装包的二进制文件)
- lz4一些根文件和拼花文件使用的压缩
- python-snappy一些拼花文件使用的压缩
- lzo一些拼花文件使用的压缩
- brotli一些拼花文件使用的压缩