代码之家  ›  专栏  ›  技术社区  ›  Jean Jacquemier

Apache箭头、对齐和填充

  •  1
  • Jean Jacquemier  · 技术社区  · 7 年前

    我想使用apache arrow,因为它使执行引擎能够利用现代处理器中包含的最新SIMD(单输入多数据)操作,对分析数据处理进行本机矢量化优化。( https://arrow.apache.org/ ).

    来自文档( https://arrow.apache.org/docs/memory_layout.html ),我知道内存分配可以确保64字节对齐。

    为了验证这个64字节对齐方式,我使用numpy数组的\uu array\u interface\uudata成员,该成员指向存储数组内容的数据区域,并在其上计算模64。如果结果为0,则内存地址至少按64字节对齐。

    当我在我的系统(Fedora)上执行下面的代码时,它似乎起作用(模64的结果为零),但当我在我同事的系统(Fedora)上执行相同的代码时,它不起作用:模64的结果不是零。因此,内存未按64字节对齐。

    请在此处找到我的代码:

    import pyarrow as pa
    
    tab=pa.array([[1, 2], [3, 4]])
    
    panda_array=tab.to_pandas()
    
    print('numpy address {} modulo 64 => {}'.format(panda_array.__array_interface__['data'][0], panda_array.__array_interface__['data'][0]%64))
    

    谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Uwe L. Korn    7 年前

    箭头中的内存是64字节对齐的,但在示例代码中,转换为Pandas/NumPy会生成数据的副本,因为嵌套列表数组在箭头和NumPy中的表示方式不同。在箭头中,这是使用一个缓冲区来完成的,该缓冲区保存所有列表的数据,而另一个缓冲区保存该数组中每个列表的偏移量。由于NumPy没有本机列表类型,因此它表示为一个NumPy数组,其中包含其他作为元素的NumPy数组。它们在第一个NumPy数组中表示为Python对象。

    因此,使用NumPy函数可以看到内存是由NumPy分配的,而不是由箭头分配的。因此,如果内存地址位于64字节边界上,这只是偶然的。

    在的下一个版本(0.9)中 pyarrow 将有一个 buffers 属性访问基础内存地址。然后,您应该能够直接检查箭头内存是否分配在64字节对齐的地址上(应该总是这样)。