Использование Mapped Memory Files в C # для хранения ссылочных типов - PullRequest
0 голосов
/ 27 апреля 2010

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

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

Ответы [ 3 ]

1 голос
/ 27 апреля 2010

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

1 голос
/ 27 апреля 2010

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

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

0 голосов
/ 27 апреля 2010

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

...