Использование отображаемых файлов памяти в C # для хранения типов ссылок

StackOverflow https://stackoverflow.com/questions/2722564

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top