Должен ли я использовать двоичный или текстовый файл для хранения сообщений protobuf?
-
13-09-2019 - |
Вопрос
Используя Google protobuf, я сохраняю свои сериализованные данные сообщений в файл - в каждом файле содержится несколько сообщений.У нас есть как C ++, так и Python версии кода, поэтому мне нужно использовать функции protobuf, которые доступны на обоих языках.Я экспериментировал с использованием SerializeToArray и SerializeAsString, и, похоже, существуют следующие неблагоприятные условия:
SerializeToArray Сериализировать массив:Как было предложено в одном ответе, лучший способ использовать это - указывать в префиксе к каждому сообщению его размер данных.Это отлично работало бы для C ++, но в Python не похоже, что это возможно - я ошибаюсь?
Сериализацияstring:Это генерирует сериализованную строку, эквивалентную ее двоичному аналогу, которую я могу сохранить в файл, но что произойдет, если одним из символов в результате сериализации будет - как нам найти окончания строк или сообщений, если на то пошло?
Обновить:
Пожалуйста, позвольте мне немного перефразировать.Насколько я понимаю, я не могу записывать двоичные данные на C ++, потому что тогда наше приложение Python не сможет прочитать данные, поскольку оно может анализировать только строковые сериализованные сообщения.Должен ли я тогда вместо этого использовать SerializeAsString
как на C ++, так и на Python?Если да, то лучше ли хранить такие данные в текстовом файле, а не в двоичном?Мое внутреннее ощущение двоичное, но, как вы можете видеть, это не похоже на вариант.
Решение
Лучшая практика для объединения сообщений таким образом - добавлять к каждому сообщению его размер.Таким образом, вы считываете размер (попробуйте 32-битный int или что-то в этом роде), затем считываете это количество байтов в буфер и десериализуете его.Затем прочитайте следующий размер и т.д.и т.д.
То же самое касается записи: сначала вы записываете размер сообщения, затем само сообщение.
Видишь Потоковая передача Нескольких сообщений дополнительную информацию смотрите в документации protobuf.
Другие советы
Мы добились большого успеха, кодируя сообщения в base64 и используя простой для разделения сообщений.Это, конечно, во многом будет зависеть от вашего использования - нам нужно хранить сообщения в файлах "log".Естественно, у него есть накладные расходы на кодирование / декодирование этого - но это даже отдаленно не было проблемой для нас.
Преимущество сохранения этих сообщений в виде текста, разделенного строками, до сих пор было неоценимым для обслуживания и отладки.Выясните , сколько сообщений содержится в файле ? wc -l
.Найдите N-е сообщение - head ... | tail
.Выясните , что не так с записью в удаленной системе , к которой вам нужен доступ через 2 VPN и решение citrix ?скопируйте и вставьте сообщение и отправьте его программисту по почте.
Protobuf - это двоичный формат, поэтому чтение и запись должны выполняться в двоичном формате, а не в текстовом.Если вам не нужен двоичный формат, вам следует рассмотреть возможность использования чего-то другого, кроме protobuf (существует множество текстовых форматов данных, таких как XML, JSON, CSV).;простого использования текстовых абстракций недостаточно.