У меня есть решение, в котором мне нужно очень быстро считывать объекты в память, однако двоичный поток может быть кэширован сжатым в памяти, чтобы сэкономить время на диске io.
Я возился с различными решениями, очевидно, что XmlTextWriter и XmlTextReader были не так хороши, как и встроенная двоичная сериализация. Protobuf-net отличный, но все же немного медленный. Вот некоторая статистика:
Размер файла XML: 217 kb
Размер файла в двоичном формате: 87 kb
Сжатый двоичный файл: 26 КБ
Сжатый XML: 26 КБ
Десериализация с помощью XML (XmlTextReader): 8,4 сек.
Десериализация с помощью двоичного кода (Protobuf-net): 6,2 сек.
Десериализация с помощью двоичной wo string.interning (Protobuf-net): 5,2 сек.
Десериализация с помощью двоичного файла из памяти: 5,9 сек.
Время распаковки двоичного файла в память: 1,8 сек.
Сериализация с помощью Xml (XmlTextWriter): 11 сек.
Сериализация с двоичным кодом (Protobuf): 4 сек.
Сериализация с префиксом двоичной длины (Protobuf-net): 3,8 сек.
Это заставило меня задуматься, кажется (поправьте меня, если я ошибаюсь), что главный виновник десериализации - это фактическое преобразование байтов, а не ввод-вывод. Если это так, то он должен быть кандидатом на использование новых расширений Parallel.
Поскольку я немного новичок, когда дело доходит до двоичного ввода-вывода, я был бы признателен за некоторый ввод, прежде чем я уделю время решению :)
Для простоты предположим, что мы хотим десериализовать список объектов без дополнительных полей. Моя первая идея заключалась в том, чтобы просто хранить каждое с префиксом длины. Считайте byte [] каждого из них в список byte [] и используйте PLINQ для десериализации объекта byte [] ->.
Однако с помощью этого метода мне все еще нужно читать byte [] в однопоточном режиме, поэтому, возможно, вместо этого можно было бы прочитать весь двоичный поток в память (насколько большие двоичные файлы возможны для этого, кстати?) И в начале двоичного файла вместо этого сохранить, как там много объектов и у каждого их длина и смещение. Тогда я смогу просто создать ArraySegments или что-то в этом роде, а также сделать фрагменты в параллельном режиме.
Так что вы думаете, ребята, возможно ли это?