LINUX.ORG.RU

Бинарный формат для обмена данными между c++-библиотекой и python-кодом?

 , , , ,


2

4

Ищу header-only библиотеку для бинарного-формата, поддерживающего хранение многомерных массивов, скляров и строк которые можно писать/читать из c++ и читать/писать из numpy-массивов. Оценочный размер файлов от единиц-мегабайт, до десятков гигабайт — поэтому, нужна воможность считав заголовок файла, найти нужные смещения, а данные грузить уже по необходимости. Что для этого лучше использовать? Подходит-ли для моих задач hdf5?

★★★★★

Для таких объемов можно NPY заюзать. Есть плюсовая либа для чтения/записи: https://github.com/rogersce/cnpy, но она не хедер-онли, к сожалению.

lu4nik ★★★ ()

Сделать свое на коленке? Это несложно.

В питоне есть struct, на плюсах вообще руки развязаны.

AntonI ()
Ответ на: комментарий от AntonI

Надоело велосипедить, так-то раньше и конфиги руками читал, а сейчас подключил json и сразу удобно стало. Хочется унификации ну и что бы свои данные другим можно было передавать без извратов.

thunar ★★★★★ ()
Ответ на: комментарий от thunar

Есть SWIG, хотя придется посмотреть как лежат данные в numpy.

Если хотите высокой производительности велосипедостроение практически неизбежно, увы.

AntonI ()
Ответ на: комментарий от AntonI

Это несложно

Сериализуй unsigned в бинарный формат и потом прочти его. Бьюсь об заклад ты облажаешься даже на этом. Как впрочем и другие местные

anonymous ()
Ответ на: комментарий от vasily_pupkin

Там все же речь идет о сериализации насколько я понял. Обычно такие вещи сразу хочется хранить на диске и пр.

AntonI ()
Ответ на: комментарий от AntonI

В питоне есть unsigned?

Очевидно, речь о крестах

А так из плюсов в питон перегнать вообще никаких проблем нет

Тогда продемонстрировать тоже никаких проблем. Действуй

anonymous ()

я когда-то пробовал искать форматы

для трехмерных массивов. Для картинок, понятное дело, fits есть. А для более-мерных только hdf и нашелся (не помню уж какой номер). Умеет хранить кроме данных заголовки/свойства. Но использование его (я создавал в IDL а читал в fortran) какое-то было ни разу не user-friendly. Однако, видимо, вариант, если не хочется велосипедить.

sshestov ()
Последнее исправление: sshestov (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

MessagePack

Там упор на плотность, поэтому длины полей меняются в зависимости от содержимого, и чтобы найти что-то, нужно декодировать всё до нужного кусочка. MessagePack даже не подходит для случая, когда ты хочешь сериализировать массив, но ещё не знаешь, сколько там будет элементов.

i-rinat ★★★★★ ()
Ответ на: комментарий от anonymous
import struct
help (struct)

Бьюсь об заклад ты облажаешься

На что будем спорить?

AntonI ()
Ответ на: я когда-то пробовал искать форматы от sshestov

Ну сейчас все как то стали юзать vtk.

Мне vtk не нравится, у нас свои велосипеды. С этим есть определенные сложности, вьюверы правда работают очень быстро;-)

AntonI ()
Ответ на: комментарий от anonymous

Сериализуй unsigned в бинарный формат и потом прочти его. Бьюсь об заклад ты облажаешься даже на этом.

Для Царя или косящего под него.

  1. Таки научитесь нормально общаться - и никто не будет Ваши сообщения тереть.

  2. Вы предложили пари - я согласен. Выбираем судью (кого то из юзеров ЛОР-а). Спорим на деньги (сумму называете сами), мы оба переводим ему по этой сумме. Затем я выкладываю решение - беззнаковое целое пишется в файл/stdout при помощи fwrite и читает из файла питоном. Если решение работает, судья переводит двойную сумму мне, не работает - Вам.

Я прошу прощения у ТС-а и остальных, но быдло надо учить;-)

AntonI ()
Последнее исправление: AntonI (всего исправлений: 1)

Тебе какой ЯП интересен? Питон или крестики? В случае питона есть pickle, полубинарный уродец. А вот если тебе смещения нужны, то свой велосипед делать надо. Мало ли что тебе надо там смещаться. Хотя в случае питона мне твоя задача не нравится. Питон не про скорость, лучше брать другой ЯП и там уже заниматься байтолюбовью.

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

Я комбинировал пикл с бинарными массивами, это работает но не очень быстро.

Для озвученных объемов нужен чисто бинарный формат.

Сопряжение с нампай из плюсов у меня давеча коллега сделал, это несложно.

Самое смешное, что я буквально неделю назад прикрутил к своему вьюверу режим удаленной работы (что бы данные с сервера не выкачивать, много их больно), и там именно вот так все и сделано - свой бинарный формат, на одном конце питон, на другом плюсы, разные ОС и все работает:-)

AntonI ()

Подходит-ли для моих задач hdf5?

HDF5 не умеет удалять данные из файла, если что. И довольно неспешно развивается.

https://cyrille.rossant.net/moving-away-hdf5/

Впрочем мне, для простого хранения пары массивов с метаданными, всего хватает.

Есть еще какой-то ASDF, и он якобы тоже может data chunking.

https://asdf-standard.readthedocs.io/en/latest/index.html

Zeta_Gundam ()

ТС, для разгона подумай о БД, это не больно, может быть там выгоднее данные хранить, особенно если у тебя десятки гигабайтов, хотя зависит от твоего случая.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

Пробовал. И всякие комбинации вроде заголовок в пикле а дальше бинарный блоб пробовал.

Что бы быстро читать надо мапировать файл.

AntonI ()
Ответ на: комментарий от AntonI

Когда я с ним общался лет 10 назад он был более вменяем. Видать совсем кукушка поехала…

Для тех у кого «Горе от ума» это - норма.

Владимир

anonymous ()
Ответ на: комментарий от thunar

Тогда тебе точно protobuf или avro. И конфиги серилизовать и бинарно с другими обмениваться. То есть в принципе у тебя будет один универсальный инструмент.

invy ★★★★★ ()

А зачем для этого особый формат? void* и size

Reset ★★★★★ ()

HDF5 - самое близкое, да. Вообще часто самое лучшее решение - numpy.memmap + какой-нибудь индекс (хоть в sqlite). Ещё есть arrow, как то что ты написал в заголовке.

ei-grad ★★★★★ ()
Ответ на: комментарий от AntonI

Как ни странно, npz оказался оптимальным выбором в моём случае. В ридере удобно унаследоваться от numpy.lib.npyio.NpzFile добавив туда необходимые обёртки.

thunar ★★★★★ ()

Подходит-ли для моих задач hdf5? thunar ★★★★★  Плазмомоделист

Да.

Есть ещё разные плазмо-специфичные и не очень инициативы по унификации формата уже внутри hdf5, для вящего интеропа между коллективами и вообще.

t184256 ★★★★★ ()
Последнее исправление: t184256 (всего исправлений: 2)

нужна воможность считав заголовок файла, найти нужные смещения, а данные грузить уже по необходимости

Что для этого лучше использовать?

БД?

vvn_black ★★★★★ ()
Ответ на: комментарий от thunar

Спасибо за наводку на sympy. А в остальном… Мы видимо таки будем сидеть на своих форматах:-)

AntonI ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей