Come migliorare le prestazioni per la serializzazione e deserializzazione di un grafico a oggetti di grandi dimensioni?

2

Ho un grande oggetto grafico in .NET (F # come succede) che ho bisogno di persistere su disco e quindi caricherò di nuovo periodicamente per l'uso in un calcolo.

L'esecuzione della deserializzazione è più importante (verrà eseguita più volte) rispetto alla seriliatura (verrà eseguita una sola volta) che dovrebbe influire sulla risposta.

Attualmente sto usando FsPickler e sto usando il loro formato binario. Questo è molto conveniente / facile da usare, ma sto cercando di capire quanto prestazioni otterrei personalizzando un serializzatore / deserializzatore ...

Una delle strade che sto considerando è quella di persistere e caricare da un piccolo database relazionale (ho in mente sqlite). Devo aspettarmi che sia molto più veloce?

Per richiesta di seguito, ho fornito una versione leggermente semplificata del grafico dell'oggetto su cui sto lavorando di seguito:

codice

type Value = 
    | Float of float
    | String of string
    | Bool of bool

[<Struct>]
type Address (i:int, j:int, k:int) =
    member this.I = i
    member this.J = j
    member this.K = k


type Data = {
    Target:Address
    mutable SpecialIndex:int
    mutable Parameters1 : Value []
    mutable Parameters2 : Address []
    Check1 : bool
    Check2:bool
    Parent: Address option
}

type Persisted = 
    { 
      Inputs : Address []
      Outputs : Address []
      Aliases : Dictionary<string, Address>
      Mapping : Dictionary<string, int>
      Masters: Dictionary<Address, Value[]>
      BigCollection : Data [] }
  1. L'oggetto che viene mantenuto è un'istanza di Persisted .

  2. È probabile che le dimensioni grandi si verifichino a causa del fatto che Persisted.BigCollection si trova nell'ordine di 10 o più elementi dell'array.

posta Sam 04.11.2015 - 16:04
fonte

1 risposta

6

One avenue I am considering is to persist and load from a small relational database (I have sqlite in mind). Should I expect this to be much faster?

No, non dovresti aspettarti questo. Sebbene non sia completamente impossibile, per la mia esperienza l'uso di un database relazionale per deserializzare un oggetto grafico è raramente più rapido della deserializzazione da un file. Secondo la mia esperienza, i database relazionali possono solo aiutare ad aumentare le prestazioni quando puoi sfruttare i loro punti di forza come la capacità di indicizzazione o la gestione di dati esterni troppo grandi per essere caricati in memoria in una sola volta.

I am trying to get a handle on how much more performance I would get by customizing a serializer/deserializer.

Qualunque serializzatore / deserializzatore tu usi, il limite superiore (e spesso il collo di bottiglia) per le prestazioni è la velocità I / O del tuo disco in "byte al secondo". Quindi, guarda la dimensione prevista in byte del tuo grafico serializzato, dividila per la velocità e otterrai un limite inferiore per il tempo di deserializzazione. Quando il tempo richiesto dal deserializzatore è vicino a quel limite, l'unico modo risonabile per aumentare le prestazioni è utilizzare un disco più veloce (come un SSD moderno o qualcosa del genere).

    
risposta data 04.11.2015 - 22:42
fonte

Leggi altre domande sui tag