GOOGLE ADS

суббота, 7 мая 2022 г.

Сравнение протобуфа и стрелы

Обе библиотеки обмена данными не зависят от языка и платформы. Интересно, в чем разница между ними и какая библиотека хороша для каких ситуаций.


Решение проблемы

Они предназначены для двух разных задач. Protobuf предназначен для создания общего «сетевого» или «дискового» формата данных.

Arrow предназначен для создания общего формата данных «в памяти».

Конечно, следующий вопрос, что это значит?

В Protobuf, если приложение хочет работать с данными, оно сначала десериализует данные в некое представление «в памяти». Это необходимо сделать, потому что формат Protobuf несовместим с инструкциями процессора. Например, protobuf упаковывает целые числа без знака в varints. Они имеют переменное количество байтов, а проводной тип поля втиснут в 3 младших значащих бита. Вы не можете взять два целых числа без знака и просто сложить их без предварительного преобразования их в какое-то представление «в памяти».

Теперь у protocнего есть библиотеки для каждого языка для преобразования в представление «в памяти» для этих языков. Однако такое представление «в памяти» встречается нечасто. Вы не можете взять сообщение Protobuf, десериализовать его в C# (используя protocсгенерированный код), а затем обработать эти байты в памяти в Java без выполнения какой-либо сортировки данных C#->Java.

Arrow, с другой стороны, решает эту проблему. Если у вас есть таблица Arrow в C#, вы можете сопоставить эту память с другим языком и начать обработку на ней без какой-либо маршалинга данных "язык-язык". Эта нулевая копия обеспечивает эффективную передачу данных между языками. Python уже некоторое время использует подобные трюки (например, протокол массива), и он отлично работает для анализа данных.

Тем не менее, Arrow не всегда лучший формат для беспроводной передачи, потому что он может быть неэффективным. Те варианты, о которых я упоминал ранее, помогают Protobuf сократить размер сообщения. Кроме того, Protobuf помечает каждое поле, чтобы сэкономить место при наличии большого количества необязательных полей. На самом деле Arrow использует Protobuf и gRPC для беспроводной передачи метаданных в Arrow Flight (фреймворк RPC).

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...