2010-04-27 4 views
0

Мне нужно как можно быстрее сохранить словарь в файл. И ключ, и значение являются объектами и не гарантируются как маркированные как Serializable. Также я предпочитаю метод быстрее, чем сериализацию тысяч объектов. Поэтому я просмотрел поддержку Mapped Memory Files в .NET 4. Однако, похоже, MemoryMappedViewAccessor позволяет хранить только структуры, а не ссылочные типы.Использование файлов Mapped Memory в C# для хранения типов ссылок

Есть ли способ хранения памяти, используемой ссылочным типом файла, и восстановления объекта из этой ячейки памяти (без двоичной сериализации)?

ответ

1

Файлы с отображением памяти в основном несовместимы с сборщиком мусора. Именно поэтому так долго требовалась поддержка такой основной функции операционной системы .NET. Типы ссылок должны быть сериализованы для представления MMF, MemoryMappedViewStream, никоим образом не обойти это. Подобное ограничение существует в неуправляемом коде, объекты с указателями должны быть сплющены, поэтому объекты с заостренными объектами также видны в представлении.

Независимо от того, сериализуете ли вы их в MMF или в файл, это не имеет никакого значения, кэш файловой системы также реализуется с MMF. Файл пишет очень быстро, при условии, что записанные данные вписываются в доступную отображаемую память. Если это проблема, посмотрите на 64-разрядную операционную систему, чтобы решить эту проблему.

0

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

+0

Сериализация словаря ~ 50 мегабайт занимает около 70 секунд на рабочей станции dev с 32-разрядной рабочей станцией. Поэтому я думаю: да, это медленно, но вы хотите определить «слишком медленно», – Khash

1

Я считаю, что сохранение памяти памяти просто неработоспособно, потому что эта память, если она имеет ссылочные типы, будет иметь указатели на другие блоки памяти, которые, скорее всего, не будут применяться в следующий раз при доступе к файлу. Вот почему существует двоичная сериализация: поддерживать эти типы ссылок. Если вам действительно нужен жесткий контроль, я бы использовал System.IO.BinaryWriter и BinaryReader, чтобы иметь полный контроль над тем, что записано в файл в какой последовательности, минимизируя накладные расходы.

Смежные вопросы