1

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

从文档(https://arrow.apache.org/docs/memory_layout.html)中,我了解到内存分配确保大约 64 字节对齐。

为了验证这 64 字节对齐,我使用 numpy 数组的 __array_interface__ 数据成员,该数组指向存储数组内容的数据区域,并在其上计算模 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))

感谢您的帮助。

4

1 回答 1

2

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

因此,使用 NumPy 函数,您会看到 NumPy 分配的内存,而不是 Arrow 分配的内存。因此,如果您的内存地址位于 64 字节边界上,那只是偶然。

在下一个版本(0.9)pyarrow中将有一个buffers属性来访问底层内存地址。然后,您应该能够直接检查 Arrow 内存是否分配在 64 字节对齐的地址上(应该总是如此)。

于 2018-02-17T15:41:16.713 回答