Streaming Boost.Сериализация архивов

У меня есть большой набор данных (100 тыс. + Элементов), который я хочу сериализовать с помощью Boost.Serialization. Это работает удовлетворительно.

Теперь при работе с еще большими наборами данных весь набор больше не помещается в память (в настоящее время я храню std::map со всеми данными в архиве). Так как мне не нужно ни случайное чтение, ни запись, а только доступ к одному элементу за раз, я подумал о потоковой передаче набора данных путем непосредственного сохранения экземпляров в архив (archive << item1 << item2 ...) и распаковывать их по одному.

Другим вариантом было бы разработать новый формат файла с нуля (что-то простое, как <length><block> где каждый <block> соответствует одному архиву Boost.Serialization), потому что я заметил, что невозможно определить конец архива в Boost.Serialization без перехвата исключений (input_stream_error надо бросить на прочтение за конец архива, я думаю).

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

1 ответ

Решение

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

Фактически, Boost Serialization не имеет ничего, кроме интерфейса потокового архива. Так что да, применимый подход будет делать, как вы сказали:

archive << number_of_items;
for(auto it = input_iterator(); it != end(); ++it)
    archive << *it;

На самом деле, очень мало мешает вам сделать то же самое в вашем serialize метод. Вы могли бы даже сделать это "автоматическим", завернув ваш поток во что-то (например, iterator_range?) и расширение Boost Serialization, чтобы "понимать" их, как "понимает" контейнеры, массивы и т. д.

Подход к формату файла определенно не чище (с точки зрения библиотеки), поскольку разрушает изоляцию формата архива. Библиотека сериализации была тщательно разработана, чтобы избежать знаний о представлении архива, и было бы нарушением абстракции, чтобы обойти это. Также см

Другие вопросы по тегам