LINUX.ORG.RU

Универсальный(?) формат хранения данных

 , , ,


2

3

Будет много текста.

Я даже не знаю, скорее всего я спрашиваю — «где мне взять такое готовое?», но, дело в том, что кратко я это описать не смогу, т.к. не знаю как это называется.

Итак, что же мне нужно.

Я хочу раз и навсегда выбрать и использовать универсальный формат хранения данных. Что я под этим подразумеваю?

Берем некую абстрактную программу, которая манипулирует какими-либо данными. И эти данные сохраняются. Пусть будут живые примеры: Ardour сохраняет свои проекты в XML, фотошоп в своем бинарном, ёксель в zip+XML, ну и т.д...

Как правило (в приведенных примерах и далее в моем случае) сами данные представляют собой «дерево» где какие-то зависимые элементы лежат внутри родительских. Некоторые (ёксель) комбинируют несколько уровней для создания дерева данных: zip->fs->xml.

А зачем это все? Я же просто хочу сохранять состояние, файл проекта, логи или что-то еще.. Т.е, конечно понятно, возможно где-то удобен xml, где-то JSON, где-то ini, а где-то бинарь. Но проблема в том, что у всех все по разному. И для преобразования в удобоваримый вид внутри приложения (структуры, массивы, указатели, ссылки, значения), (кроме бинарного хранения) необходим парсер и интерпретатор/транслятор этих данных, причем в обе стороны (fs->?*->app и app->?*->fs). Форматов много, и для каждого куча либ, писанных за авторстом от васяна до профессора.

Нет, я пишу сюда потому, что не хочу чтобы случилось так: http://twentysix.ru/uploads/images/00/91/06/2016/05/10/adaaed_full.png

Выше я описал все расплывчато. А теперь будет более похоже на спеку. Конечно я могу упустить сейчас некоторые детали. Но это от того, что я не продумывал все глубоко. И все еще уверен, что я далеко не первый, и эта шляпа уже сделана и имеет название.

Итак, поехали.

1) Формат хранения данных — бинарный. Да, бинарный. Почему? Потому что сразу прочитал его в память (да, с валидацией, о ней ниже) и все.

2) Дерево данных. Каждый узел — это бинарный пакет с заголовком, хешсуммой и указанием размера узла, включая размеры потомков, или смещения откуда начинаются потомки со своими заголовками. Да, декларативное бинарное описание структур данных любого моего/вашего приложения.

3) Единый парсер-транслятор туда/сюда. Он знает только то, как ему распарсить свои декларации, отсеить их, а на выходе будут уже готовые к работе данные в памяти. Таким образом вы можете seek'ать в файле или ожидать желаемую позицию смещения в буфере, чтобы пропустить не интересующие вас в данный момент данные (в XML, да и в любых text-based, с этим облом, он последовательный, текстовый, посимвольный, пока не пропарсишь минимум узел, а он может быть огромным, с вложениями, ты не узнаешь структуру). Так же для парсера должна быть определена схема (отсылка к XSD schema) внутри приложения, можете называть это конфигом парсера для заточки именно под ваши данные. Именно сюда могут быть и «забиндены коллбеки валидатора». При сохранении же должно быть обратное действие.

Теперь снова простыми словами.

Я хочу что-то типа бинарного XML, ака узлы-пакеты, где сразу лежат бинарные данные. И универсально транслировать это все в сишное приложение.

Так вот. Есть ли такое готовое? Если есть — подскажите. Если нет — отпишитесь что вы обо всем этом думаете? Какие слабые и сильные стороны этой эпопеи?

<joke-mode>Хм... Да, очень похоже на кусок OSI. Но почему данные не хранят в виде TCP пакетов?</joke-mode>

Сабж.

берёшь python
там есть конверторы ДЛЯ ВСЕГО
хранишь в pickle

// русское народное хокку

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

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

берёшь python

Зачем мне монти-пайтон в сишном приложении?

там есть конверторы ДЛЯ ВСЕГО

Зачем мне лишние прослойки с ограничениями?

я подобное уже встречал: правда, не встречал тех, кому это нужно

Диссонанс. Если встречал, значит написано, если написано, значит было нужно.

deep-purple ★★★★★ ()

Да, тыж упорот! Для справки такие безупные идеи приходили не только тебе, и даже людям с высшим образованием, и где они теперь? Твой бинарный формат не учитывает массу нюансов.

Для примера, уже есть эталонная реализация того что ты сейчас описал, называется Windows Registry.

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

Зачем мне лишние прослойки с ограничениями?

шобы ДЛЯ ВСЕГО, разумеется

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

Да, тыж упорот! Для справки такие безупные идеи приходили не только тебе, и даже людям с высшим образованием, и где они теперь?

Гвидо вон Python написал. Ща и этот напишет. Хотя зачем нам два питона? Хотя да, их уже два. Тогда зачем нам три питона?

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

Я не понял твоего сарказма, расшифруй его.

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

Камент годный. Ты тока не рамси.

Да, не учитывает массу нюансов. Я об этом писал выше. Винрег тоже имеет массу нюансов? Или там проблемы решили?

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я не понял твоего сарказма, расшифруй его.

Это не сарказм. Хотя, может быть, ты изобретёшь что-то другое. Мне всё равно, если честно, я вообще случайно в тему зашёл. :) Дайте теперь спокойно из неё выйти :)

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

Идаже еще. Тут вопрос не «где они теперь» а — почему они нигде? На что напоролись?

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

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

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

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

Можешь просто сказать: «Всем чмоке в этом чате», и свалить.

anonymous ()

Универсальный формат
Я хочу раз и навсегда выбрать

Ты выбрал не ту профессию.

</thread>

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

Зачем мне монти-пайтон в сишном приложении?

ну если такой ъ-мужик, тогда возьми и перепиши его на своём Си.

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

как твой бинарный формат будет работать на разных платформах и ос?

Указать в спеках требования. Типа, юзать из <unistd.h>, всегда ожидать LE, сделать заголовки исключительно ансайнед чаровыми и т.д.

ты говоришь про нечто, что будет невероятно сложным и громоздким

На примере XML это не выглядит громоздким. В целом XML близок к тому что я хочу, но он текстовый. Но тут я уже повторяюсь.

deep-purple ★★★★★ ()
Ответ на: комментарий от darkenshvein

Зачем? Под любые форматы есть куча сишных либ. Моя хотелка — избавиться от прослоек. Либа это прослойка, а каждая либа это индивидуальная прослойка со своим апи. Я же думаю о одной универсальной сразу в бинаре.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Зазипуй XML, и ты получишь что хочешь... Недооценивай возможность читать, а возможно и писать в твой конфиг используя только vi

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

Зазипуй XML, и ты получишь что хочешь

Неа:

Таким образом вы можете seek'ать в файле или ожидать желаемую позицию смещения в буфере, чтобы пропустить не интересующие вас в данный момент данные (в XML, да и в любых text-based, с этим облом, он последовательный, текстовый, посимвольный, пока не пропарсишь минимум узел, а он может быть огромным, с вложениями, ты не узнаешь структуру).

deep-purple ★★★★★ ()

Старые микрософтовские форматы это по сути кусок FAT12 с данными: EMF, все офисовские, они такие.

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

Становится интереснее. Хы, уже второй раз снова про некрософт. Только они этим промышляли? Можешь не отвечать на этот вопрос, это просто сарказм.

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

https://github.com/msuhanov/regf/blob/master/Windows registry file format spe...

там все довольно прилично сделано. тебе дело говорят, кмк.

второй раз снова про некрософт

б-г троицу любит.

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

Хм... Да, очень похоже на кусок OSI

в каждой шутке, сами понимаете что :-)

ASN.1 и BER/DER

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

Единственное вменяемое сообшение в треде

anonymous ()

1) Формат хранения данных — бинарный.

Закапывайте. Нигде кроме сишки это не нужно.

Я как-то предложил использовать бинарь вместо json, для работы с данными и с ПК и с андроида, так Java-прогер позеленел и пожаловался начальству, что мол это абсолютный ужас и в java так делать нельзя. В итоге остались вообще на xml. Хотя бинарный формат, который я сбацал на коленке, был в десятки раз меньше, ибо большинство данных - блоб, которые в xml через base64 хранится.

Про JS вообще молчу. Там с бинарями всё плохо, а учитывая, что веб - большая часть рынка - то получаем провал формата.

2) Дерево данных.

Дерево - это хорошо. Только все, кроме ini, это и так умеют.

3) Единый парсер-транслятор туда/сюда.

Единый для кого?

пока не пропарсишь минимум узел, а он может быть огромным, с вложениями, ты не узнаешь структуру

Как бы зависит от парсера. Можно пропускать элементы/атрибуты, если хочется.

В общем диагноз - вылезайте из мира сишки.

RazrFalcon ★★★★★ ()

самое простое что подходит под твою спеку формат RIFF (тот что от майкрософта, используется в файлах WAV и AVI, но позволяет хранить произвольные данные). А если нужна неограниченная вложенность узлов тогда бери более сложный bson, как тут уже сказали выше.

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

абсолютный ужас и в java так делать нельзя.

Может ты в свой формат unsigned полей понапихал, с битовыми масками, это единственное что приходит на ум с чем в джаве туго.

pftBest ★★★★ ()

Я хочу что-то типа бинарного XML

Protobuf что ли?

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

Тестовый вариант был на QDataStream. Но я предлагал и protobuf.

RazrFalcon ★★★★★ ()

Зоопарк форматов придуман не столько для хранения, сколько для обмена данными между разными приложениями/системами/платформами. Возможность хранения — это всего-лишь полезный побочный эффект, от которого местами никуда не деться.

А в погоне за универсальностью ты

  • изобретёшь ещё один велосипед до кучи;
  • понапишешь туеву хучу собственных «универсальных» либ для твоего формата;
  • будешь единственным, кто понимает твой бинарный блоб, пока не опубликуешь его документацию и/или код, которым заинтересуется и станет пользоваться хоть кто-нибудь.
blexey ★★★★ ()

Возьмите msgpack и не мучайтесь.

Sorcerer ★★★★★ ()

HDF5 предлагали?

anonymous ()

Всё, что нужно, уже упомянули: binary XML, binary JSON, msgpack. ТС, что еще тебе нужно?

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

Вот это годнота! Отмечаю решенной!

Остальные либо чушь несли, либо не до конца поняли чего я хочу.

deep-purple ★★★★★ ()
Ответ на: комментарий от tailgunner

Эмм. А что нужно тебе? Чего не промолчал увидев что сказать уже нечего?

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

А что нужно тебе?

Ответ на заданный вопрос, естественно.

Чего не промолчал увидев что сказать уже нечего?

Была вероятность, что тебе есть еще что сказать. Но, видно, нечего.

И кстати, ASN.1 - раздутое неюзабельное говно. Используется только в замшелом ынтерпрайзности.

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

Ну у меня другие дела есть, я не сижу тут постоянно. Вот сейчас зашел.

Короче удали наш с тобой оффтоп. Тут и без него оффтопа хватает ))

deep-purple ★★★★★ ()
Ответ на: комментарий от tailgunner

ASN.1 - раздутое неюзабельное говно. Используется только в замшелом ынтерпрайзности

Я уже глянул — бизон вроде ничего так. Но это мне теперь читать все и про асн и про бизон. Тогда уже точно сравню.

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

Бизон? Ты что, собрался парсер языка описания данных сам писать? Ну-ну.

tailgunner ★★★★★ ()
Ответ на: комментарий от deep-purple

Так имплементации же есть.

Тогда о каком бизоне ты говоришь?

И приличной открытой реализации - нет. Есть asn1c, но там не всё, и пользоваться ей не то, чтобы удобно.

tailgunner ★★★★★ ()

название символичное

libaugeas

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

Ваше мнение очень важно для ITU, продолжайте!

ASN.1 используется в связи, тащемта.

shkolnick-kun ★★★★ ()
Ответ на: комментарий от deep-purple

http://bsonspec.org/implementations.html

На, там есть две реализации на Си, не смей писать третью!

А для ASN.1 приличных опенсорсных реализаций практически нет, то ты можешь попробовать кресты и PTLIB.

shkolnick-kun ★★★★ ()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от shkolnick-kun

Ваше мнение очень важно для ITU, продолжайте!

Мнение ITU еще важнее для меня. А насколько оно важно для ТС - можно только гадать.

ASN.1 используется в связи, тащемта.

Порождение сумрачного гения ITU используется в телекоме? Да, и правда внезапно. А где оно еще используется? Я так и думал.

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

У тебя сотовый есть?

А роутер?

А смарт-ТВ?

А IoT-микроволновка?

Так вот в этом всём есть тот самый телеком! И там есть как минимум парсеры ASN.1. написанные неизвестными индусами на небезопасном ЯП, хрен знает сколько лет назад, поэтому никто не поддерживает...

Страшно?

То-то же!

shkolnick-kun ★★★★ ()
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.