Size: a a a

Compiler Development

2020 March 11

АВ

Александр Вольнов in Compiler Development
polunin.ai
Если можно хранить что угодно, будут издержки на преобразование данных в формат и обратно. Следовательно уже нельзя использовать как БД.
Делаете такую структуру, которая совпадает со структурой вашей программы. Маппите в память файл и сразу работаете без преобразования. Если в новой версии программы структура поменялась, рантайм всё преобразует с потерей производительности и вместо замапленного файла выдаст буфер, в котором данные преобразованы. В этом случае потеря производительности будет, зато всё будет работать.
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
Делаете такую структуру, которая совпадает со структурой вашей программы. Маппите в память файл и сразу работаете без преобразования. Если в новой версии программы структура поменялась, рантайм всё преобразует с потерей производительности и вместо замапленного файла выдаст буфер, в котором данные преобразованы. В этом случае потеря производительности будет, зато всё будет работать.
Big-endian/little-endian anyone? 😉
источник

АВ

Александр Вольнов in Compiler Development
Alexander Tchitchigin
Вы же в курсе, что у ProtoBuf есть язык описания структуры хранения, позволяющий таки описать "ровно ту структуру, которая подходит под задачу"? Как и у Thrift, и т.п. 😉
Я хочу массив 3-битных интов, и хранить его в запакованном виде. Как мне сделать это в protobuf, не программируя запаковку бит в программе?
источник

АВ

Александр Вольнов in Compiler Development
Alexander Tchitchigin
Big-endian/little-endian anyone? 😉
Little-endian и big-endian уже продуманы, поддерживаются оба.
источник

АВ

Александр Вольнов in Compiler Development
И выравнивание поддерживается тоже.
источник

p

polunin.ai in Compiler Development
Александр Вольнов
Я хочу массив 3-битных интов, и хранить его в запакованном виде. Как мне сделать это в protobuf, не программируя запаковку бит в программе?
Запрограммировать в программе
источник

p

polunin.ai in Compiler Development
Не вижу причин выносить упаковку куда-то
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
Я хочу массив 3-битных интов, и хранить его в запакованном виде. Как мне сделать это в protobuf, не программируя запаковку бит в программе?
Я-то с ProtoBuf не работал, но кто работал наверняка могут с ходу написать спеку, по которой protoc (или как там его) генерирует нужный код запаковки/распаковки. 🤷‍♀️
источник

p

polunin.ai in Compiler Development
Программа преобразует данные. БД из хранит. Распределение обязанностей.
источник

АВ

Александр Вольнов in Compiler Development
polunin.ai
В итоге это выльется в два года. Потом на бенчмарках окажется, что ваше решение медленне уже существующих раз в 500.
Открыть файл, быстро распарсить информацию о типах в начале файла и замапить в память. Будет как flatbuffers.
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
Little-endian и big-endian уже продуманы, поддерживаются оба.
И как же они поддерживаются так чтобы "маппите в память файл и сразу работаете без преобразования"?
источник

АВ

Александр Вольнов in Compiler Development
polunin.ai
Не вижу причин выносить упаковку куда-то
А потом в новой версии программы я решу, что мне надо 5 бит, а не 3. И библиотека сама преобразует старый файл при открытии из 3 бит в 5.
источник

p

polunin.ai in Compiler Development
Александр Вольнов
Открыть файл, быстро распарсить информацию о типах в начале файла и замапить в память. Будет как flatbuffers.
Спасибо, pickle уже показал себя. Не надо нам такого
источник

АВ

Александр Вольнов in Compiler Development
Alexander Tchitchigin
И как же они поддерживаются так чтобы "маппите в память файл и сразу работаете без преобразования"?
На Little-endian архитектуре данные будут сериализовываться в little-endian виде, а на big-endian - в big-endian. Если перекинуть BE файл на LE машину и открыть его, библиотека поймёт, что порядок отличается и сконвертит автоматически.
источник

AT

Alexander Tchitchigin in Compiler Development
Александр Вольнов
На Little-endian архитектуре данные будут сериализовываться в little-endian виде, а на big-endian - в big-endian. Если перекинуть BE файл на LE машину и открыть его, библиотека поймёт, что порядок отличается и сконвертит автоматически.
Ну, я смотрю, у Вас всё схвачено. 👍
Главное - инвестора найти. 😊
источник

AT

Alexander Tchitchigin in Compiler Development
(Для справки: это была ирония. 😊)
источник

MM

Mikhail Maltsev in Compiler Development
Александр Вольнов
Открыть файл, быстро распарсить информацию о типах в начале файла и замапить в память. Будет как flatbuffers.
В protobuf, к примеру, не нужно хранить информацию о типах, она хранится в схеме (т.е. в парсере, а не самих данных), поэтому protobuf компактнее, чем форматы, хранящие информацию о типах (sqlite, message pack). Зато во втором случае можно работать с данными, не зная схемы или зная её лишь частично. Json - вообще текстовый формат, его могут читать и редактировать люди в обычном редакторе, зато он намного менее компактный, чем дaже message pack.
Форматов много потому что требования в разных задачах разные. Как вы всё это сможете совместить в одном формате?
источник

АВ

Александр Вольнов in Compiler Development
polunin.ai
Программа преобразует данные. БД из хранит. Распределение обязанностей.
Когда всё вместе и в рамках одного языка, получается всё гораздо проще. Сериализация не нужна, потому что сам язык и есть формат сериализации.
источник

p

polunin.ai in Compiler Development
Alexander Tchitchigin
(Для справки: это была ирония. 😊)
Ну если он распишет технически как оно будет работать и это заинтересует какой-то Яндекс то чё нет. Он не этого не сделает, его отошьют когда увидят ТП. Но пусть пробует, нам то что)
источник

p

polunin.ai in Compiler Development
Александр Вольнов
Когда всё вместе и в рамках одного языка, получается всё гораздо проще. Сериализация не нужна, потому что сам язык и есть формат сериализации.
То есть я не могу контролировать формат?
источник