problema
- Come posso progettare il mio parser di file per massimizzare l'hardware durante l'elaborazione (creando metadati per) un file di grandi dimensioni
(cioè come evitare di essere bloccato da IO e di esaurire la memoria)
preferibilmente vorrei dare all'utente una "priorità alta" (blocca il sistema a parte l'interfaccia utente di avanzamento) e un'opzione "Esegui in background" (consente all'utente di iniziare a utilizzare i dati che sono già stati indicizzati / caricati)
Ipotesi
- Presumibilmente non avrò problemi con più thread leggere lo stesso insieme di file?
- Il modo in cui lo vedo il più grande collo di bottiglia / sarà scrivere nel database. Presumibilmente dovrò bloccarlo / sbloccarlo e fare in modo che ogni thread accoda i dati per scrivere in batch?
- Poiché ogni thread avrà bisogno di proprie code di dati, non sono sicuro di come assicurarsi che la macchina non abbia esaurito la memoria
- Quando si elaborano i blocchi di dati, in pratica voglio ottenere cose come medie, minimi e massimi, ho presunto che non posso usare la GPU per elaborare blocchi di dati come questo? sente come se ci fossero troppi dati condivisi per utilizzare la GPU qui.
dettaglio:
Sto lavorando con insiemi di dati molto grandi, suddivisi su più file (ogni file di dati "completo" è di 1.5 gb e spesso ci sono molti di questi file (ne sto vedendo uno ora che ne ha 10)
I dati contengono effettivamente una serie di buffer a cui voglio accedere 1 o più alla volta.
| HeaderInfo-datablock | HeaderInfo-datablock | HeaderInfo-datablock | (Migliaia)
Voglio passare attraverso il file di dati, riempiendo un database con informazioni di indice (così posso accedere rapidamente a blocchi specifici in base alle informazioni nell'intestazione o al datablock stesso). Se posso, vorrei anche scambiare le informazioni con un'immagine di un grafico mentre lo faccio.
Hardware
Il computer su cui verrà eseguito è un PC workstation adatto, quindi sono disponibili RAM e potenza di elaborazione sufficienti:)
Sulla macchina con specifiche superiori ci sono 64GB di ram e un i7 che ha 12 core (hyperthreaded) quindi in teoria potrei farla franca con il caricamento dell'intero file in memoria e quindi l'elaborazione. Ma alcune delle macchine con le specifiche inferiori hanno meno RAM e i file che le persone producono stanno diventando più grandi ogni giorno, quindi non è lungimirante pensare di basarsi su quel piano.
Tecnologia
Sto usando C # quindi qualsiasi suggerimento sui modi migliori per giudicare le funzionalità hardware in C # (in fase di esecuzione) e massimizzarli quando si accede a un set di file di grandi dimensioni, sarebbe un grande vantaggio