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-байтовом выровненном адресе (так должно быть всегда).