Apache arrow, выравнивание и отступ

Я хочу использовать стрелку apache, потому что она позволяет механизмам исполнения использовать последние операции SIMD (с одним входом и несколькими данными), включенные в современные процессоры, для встроенной векторизованной оптимизации обработки аналитических данных. ( https://arrow.apache.org/).

Из документации ( https://arrow.apache.org/docs/memory_layout.html) я понимаю, что при распределении памяти необходимо обеспечить выравнивание 64 байта.

Чтобы проверить это 64-байтовое выравнивание, я использую элемент данных __array_interface__ массива numpy, который указывает на область данных, в которой хранится содержимое массива, и вычисляет по нему модуль 64. Если результат равен 0, то адрес памяти выравнивается не менее чем на 64 байта.

Когда я выполняю код, приведенный ниже, в моей системе (Fedora) он работает (результат modulo 64 равен нулю), но когда я выполняю тот же код в системе моего коллеги (тоже в Fedora), он не работает: результат modulo 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 ответ

Решение

Память в Arrow выровнена на 64 байта, но в вашем примере кода преобразование в Pandas/NumPy делает копию данных, поскольку вложенный массив списков по-разному представлен в Arrow и в NumPy. В Arrow это делается с использованием одного буфера, который содержит данные всех списков, в то время как есть другой буфер, который содержит смещения для каждого списка в этом массиве. Поскольку NumPy не имеет собственного типа списка, он представляется в виде массива NumPy, который содержит другие массивы NumPy в качестве элементов. Они представлены в первом массиве NumPy как объекты Python.

Таким образом, используя функции NumPy, вы видите память, выделенную NumPy, а не Arrow. Таким образом, если ваш адрес памяти находится на границе 64 байта, это только случайно.

В следующей версии (0.9) pyarrow там будет buffers свойство для доступа к базовым адресам памяти. После этого вы сможете напрямую проверить, выделена ли память Arrow на 64-байтовом выровненном адресе (так должно быть всегда).

Другие вопросы по тегам