Стрелка Apache, выравнивание и отступы

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

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

Чтобы проверить это 64-байтовое выравнивание, я использую элемент данных __array_interface__ массива numpy, который указывает на область данных, в которой хранится содержимое массива, и вычисляю на нем по модулю 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))

Спасибо за помощь.


person Jean Jacquemier    schedule 16.02.2018    source источник
comment
не работает довольно расплывчато. Что именно вы получите? минимальный воспроизводимый пример.   -  person Peter Cordes    schedule 17.02.2018
comment
Я согласен и прошу прощения, я снова редактирую свой пост, и надеюсь, что он более понятный.   -  person Jean Jacquemier    schedule 17.02.2018
comment
Намного лучше, теперь у вас есть четкий и конкретный вопрос. Если бы я знал что-нибудь о python и apache-arrow, я бы, наверное, смог на это ответить. (Я делаю свои SIMD в asm и C / C ++).   -  person Peter Cordes    schedule 17.02.2018


Ответы (1)


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

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

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

person Uwe L. Korn    schedule 17.02.2018
comment
В первом абзаце вы имели в виду 64 байта с выравниванием? 8-байтовое выравнивание не очень помогает для большинства наборов инструкций SIMD. - person Peter Cordes; 17.02.2018
comment
Да я имел ввиду 64 байт. Подправил ответ. - person Uwe L. Korn; 17.02.2018
comment
Есть ли способ избежать копирования во время преобразования стрелки в Pandas / NumPy. ? Документация Arrow указывает на процессы с нулевым копированием: формат памяти Arrow поддерживает чтение с нулевым копированием для молниеносного доступа к данным без накладных расходов на сериализацию - person Jean Jacquemier; 19.02.2018
comment
К сожалению, это возможно только на очень небольшом наборе Pandas DataFrames из-за внутренних компонентов BlockManager. Для случая Pandas Series / NumPy многие преобразования являются нулевыми, но только те, для которых существуют собственные типы NumPy. Это все типы int * и float *, а также категориальный тип в Pandas. - person Uwe L. Korn; 19.02.2018