Ho un'applicazione .NET scritta in C# (.NET 4.0). In questa applicazione, dobbiamo leggere un set di dati di grandi dimensioni da un file e visualizzare i contenuti in una struttura a griglia. Quindi, per fare ciò, ho inserito un DataGridView nel modulo. Ha 3 colonne, tutti i dati delle colonne provengono dal file. Inizialmente, il file aveva circa 600.000 record, corrispondenti a 600.000 righe nel DataGridView.Gestione di serie di dati molto grandi e caricamento just in time
Ho subito scoperto che, DataGridView collassa con un set di dati così grande, così ho dovuto passare alla modalità virtuale. Per fare ciò, prima leggo il file completamente in 3 diversi array (corrispondenti a 3 colonne), quindi viene generato l'evento CellValueNeeded, fornisco i valori corretti dagli array.
Tuttavia, in questo file può esserci un numero enorme (ENORME!) Di record, come abbiamo rapidamente scoperto. Quando la dimensione del record è molto grande, la lettura di tutti i dati in un array o un elenco <>, ecc. Sembra non essere fattibile. Corriamo rapidamente negli errori di allocazione della memoria. (Eccezione di memoria insufficiente).
Siamo rimasti bloccati lì, ma poi ci siamo resi conto, perché leggere prima tutti i dati negli array, perché non leggere il file su richiesta con l'evento CellValueNeeded? Ecco cosa facciamo ora: apriamo il file, ma non leggiamo nulla e, quando gli eventi CellValueNeeded si attivano, cerchiamo dapprima Seek() nella posizione corretta nel file, quindi leggiamo i dati corrispondenti.
Questo è il meglio che abbiamo potuto trovare, ma, prima di tutto, è piuttosto lento, il che rende l'applicazione lenta e non facile da usare. In secondo luogo, non possiamo fare a meno di pensare che ci deve essere un modo migliore per farlo. Ad esempio, alcuni editor binari (come HXD) sono incredibilmente veloci per qualsiasi dimensione di file, quindi mi piacerebbe sapere come questo può essere raggiunto.
Oh, e per aggiungere ai nostri problemi, in modalità virtuale di DataGridView, quando impostiamo RowCount sul numero di file disponibili nel file (diciamo 16.000.000), ci vuole del tempo per DataGridView inizializza da solo. Sarebbe apprezzato anche qualsiasi commento per questo "problema".
Grazie
Ciao Jim, T, è una struttura con 4 galleggianti a doppia precisione. Quindi, 4 * 8 * 16M = 512 MB di dati. – SomethingBetter
Ho provato a utilizzare .NET MemoryMappedFile, ma non appena si crea una vista, apparentemente tenta di caricare il file in memoria, perché ho esaurito le eccezioni di memoria. Ho pensato che forse MemoryMappedFile avrebbe segmentato internamente i dati accedendo alle pagine e caricato solo le pagine richieste in memoria. – SomethingBetter
@SomethingBetter: Credo che 512 MB sia un problema se si è su una macchina a 32 bit. Se si utilizza un file mappato in memoria, si vorrà rendere la visualizzazione nel file più piccola dell'intera dimensione del file. Quindi modifichi la visualizzazione come pagine utente attraverso i dati. –