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