Domanda

Ho bisogno di memorizzare un dizionario in un file il più velocemente possibile. Sia chiave e valore sono oggetti e non garantite essere contrassegnato come serializzabile. Anche io preferisco un metodo più veloce di serializzazione di migliaia di oggetti. Così ho guardato in supporto file mappato in memoria in .NET 4. Tuttavia, sembra MemoryMappedViewAccessor consente solo memorizzazione di strutture e non tipi di riferimento.

C'è un modo di memorizzare la memoria utilizzata da un tipo di riferimento di un file e ricostruire l'oggetto da quella blob di memoria (senza serializzazione binaria)?

È stato utile?

Soluzione

Memoria mappato file sono fondamentalmente incompatibile con il garbage collector. È per questo che c'è voluto così tanto tempo per un tale funzionalità del sistema operativo principale per ottenere supportato da .NET. I tipi di riferimento devono essere serializzato per la vista MMF, MemoryMappedViewStream, nessun modo per aggirare questo. Una restrizione simile esiste nel codice non gestito, oggetti con puntatori devono essere appiattito così rilevato-oggetti sono visibili nella vista pure.

Sia che li serializzare ad un MMF o in un file non farà alcuna differenza, la cache di file system viene implementato con FMM pure. scrive file sono molto veloce, fino a quando le crisi dati scritti in memoria disponibile mappabili. Se questo è un problema poi guardare un sistema operativo a 64 bit per risolvere il problema.

Altri suggerimenti

Credo che la memorizzazione di un blob della memoria è semplicemente impraticabile perché quella memoria, se ha i tipi di riferimento, avrà puntatori ad altri blocchi di memoria che non sarà probabilmente applica la prossima volta che il file si accede. Ecco perché la serializzazione binaria esiste: per mantenere questi tipi di riferimenti. Se si vuole veramente stretto controllo, però, vorrei usare System.IO.BinaryWriter e BinaryReader di avere il pieno controllo su esattamente ciò che è scritto nel file in sequenza quello che, riducendo al minimo spese generali.

Questo è il tipo di scenario che la serializzazione binaria è stato progettato per. C'è qualche motivo specifico per cui non si vuole usare quella? Hai verificato che si tratta di 'troppo lento'? Certo, è possibile codificare il proprio serializzatore personalizzato e, probabilmente, renderlo più efficiente per lo scenario specifico, ma poi si dovrà mantenerla andare avanti. Vale la pena lo sforzo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top