Domanda

Quindi ho un numero "elevato" di "molto grande" ASCII file di dati numerici (gigabyte di tutto), e il mio programma sarà necessario elaborare la totalità di esso in modo sequenziale, almeno una volta.

Consigli per la conservazione/caricamento dei dati?Ho pensato di convertire il file binario per renderli più piccoli e per il caricamento più veloce.

Devo caricare tutto in memoria tutti in una volta?
Se non, è l'apertura che è un buon modo di caricare i dati parzialmente?
Quali sono alcune Java rilevanti efficienza suggerimenti?

È stato utile?

Soluzione

E, allora, che se il trattamento richiede saltando in giro i dati per più file e più buffer?È costante l'apertura e la chiusura dei file binari, andando a diventare costoso?

Io sono un grande fan di "memory mapped i/o', aka diretta byte buffer'.In Java sono chiamati Mappato Byte Buffer sono parte di java.nio.(Fondamentalmente, questo meccanismo utilizza il sistema operativo di paging della memoria virtuale sistema di 'mappa' dei file e li presenti a livello di codice come byte di buffer.Il sistema operativo consente di gestire in movimento i byte su disco e di memoria auto-magicamente e molto rapidamente.

Consiglio questo tipo di approccio perché funziona per me, e b) che vi permetterà di concentrarsi su un algoritmo e lasciare che la JVM, OS e hardware accordo con l'ottimizzazione delle prestazioni.Tutte frequentemente, essi sanno che cosa è meglio più di noi piccoli programmatori.;)

Come si può utilizzare MBBs nel tuo contesto?Basta creare un MBB per ognuno dei vostri file e leggerli come si vede in forma.Si avrà solo bisogno di memorizzare i risultati..

BTW:La quantità di dati che hai a che fare, in GB?Se si tratta di più di 3-4GB, quindi questo non funziona per voi su una macchina a 32-bit come la MBB attuazione è convenuto sulla spazio di memoria indirizzabile dall'architettura della piattaforma.Un computer a 64 bit & OS vi porterà a 1TB o 128TB di mappare i dati.

Se stai pensando di prestazioni, e poi sapere Kirk Pepperdine (un po ' famosa performance di Java guru. Egli è coinvolto in un sito web www.JavaPerformanceTuning.com, che ha alcuni più MBB dettagli: NIO Prestazioni Suggerimenti e altre prestazioni Java cose correlate.

Altri suggerimenti

Si potrebbe desiderare di avere uno sguardo a le voci dell' Ampio Progetto Di Ricerca (fai una ricerca su google per "ampia finder" java).

L'Ampia finder comporta la lettura di più di un sacco di righe nel file di registro, quindi, guardare le implementazioni Java e vedere che cosa ha funzionato e cosa non ha funzionato lì.

Si potrebbe convertire in binario, ma poi si ha 1+ qualcosa di copie dei dati, se avete bisogno di mantenere l'originale in tutto.

Può essere pratico per costruire una sorta di indice sulla parte superiore del vostro originale di dati ascii, in modo che se avete bisogno di passare attraverso di nuovo i dati è possibile farlo più veloce in tempi successivi.

Per rispondere alle tue domande in ordine:

Devo caricare tutto in memoria tutti in una volta?

Non se non è necessario.per alcuni file, si può essere in grado di, ma se si sta appena elaborazione sequenziale, basta fare qualche tipo nel buffer di lettura attraverso le cose una per una, la memorizzazione di qualunque avete bisogno lungo la strada.

Se non, è l'apertura che è un buon modo di caricare i dati parzialmente?

BufferedReaders/etc è più semplice, anche se si potrebbe guardare più in profondità FileChannel/ecc per utilizzare mappati alla memoria di I/O per passare attraverso le finestre di dati alla volta.

Quali sono alcune Java rilevanti efficienza suggerimenti?

Questo in realtà dipende da quello che stai facendo con i dati!

Senza ulteriori approfondimenti di che tipo di trattamento è in corso, ecco alcune riflessioni generali da quando ho fatto un lavoro simile.

  1. Scrivi un prototipo di applicazione (magari anche "a buttare via") che esegue alcune arbitrarie operazione su un insieme di dati.Vedere quanto velocemente si va.Se il più semplice, il più ingenuo, cosa che si può pensare è accettabilmente veloce, nessun problema!

  2. Se l'ingenuo approccio non funziona, considerare pre-elaborazione dei dati in modo che le successive esecuzioni di lunghezza accettabile di tempo.Si parla di dover "saltare" nel set di dati un po'.C'è un modo per pre-processo che fuori?Oppure, una pre-fase di lavorazione può essere per generare ancora più dati - i dati dell'indice che fornisce byte accurate informazioni di posizione critiche, necessarie sezioni del set di dati.Quindi, il trattamento principale di esecuzione può utilizzare queste informazioni per saltare direttamente ai dati necessari.

Così, per riassumere, il mio approccio sarebbe quello di cercare qualcosa di semplice giusto ora e vedere ciò che le prestazioni così come appare.Forse sarà bene.In caso contrario, guardare in elaborazione di dati in più passaggi, risparmiando più costose operazioni per infrequenti di pre-elaborazione.

Non "caricare tutto in memoria".Basta effettuare l'accesso ai file e lasciare che il disco del sistema operativo cache della pagina decidere quando si ottiene effettivamente tirare le cose direttamente dalla memoria.

Questo dipende molto anche i dati nel file.Grandi mainframe hanno fatto sequenziale elaborazione dei dati per un lungo periodo di tempo, ma normalmente non uso casuale di accesso per i dati.Si basta tirare una riga alla volta e di processo che molto prima di continuare.

Per l'accesso casuale è spesso la soluzione migliore per costruire oggetti con la cache di wrapper per sapere dove nel file di dati di cui hanno bisogno per costruire è.Quando necessario leggere i dati e costruire se stessi.In questo modo quando la memoria è stretto, si può solo iniziare a uccidere roba fuori senza preoccuparsi troppo di non essere in grado di tornare più tardi.

Davvero non hanno dato abbastanza informazioni per aiutarvi.Avete bisogno di caricare ogni file nella sua entiretly in ordine al processo?Oppure potete processo di linea per linea?

Il caricamento di un file alla volta, è probabile che a causare scarse prestazioni anche per i file che non sono terribilmente grande.La vostra scommessa migliore è quello di definire una dimensione del buffer che funziona per voi e leggere/elaborare i dati in un buffer di un tempo.

Ho trovato Informatica per essere un eccezionalmente utile strumento di elaborazione dati.La buona notizia è che le versioni più recenti anche consentire Java trasformazioni.Se hai a che fare con terabyte di dati, potrebbe essere il momento di pony su per il best-of-breed strumenti ETL.

Sto assumendo che tu vuoi fare qualcosa con i risultati del trattamento qui, come memorizzare da qualche parte.

Se i dati numerici è regolarmente campionati e devi fare accesso casuale in considerazione per la loro archiviazione in un quadtree.

Vi consiglio caldamente di sfruttare le Espressioni Regolari e guardando verso il "nuovo" IO nio pacchetto per inserimento più veloce.Allora dovrebbe andare il più rapidamente come si può realisticamente aspettare di Gigabyte di dati per andare.

Se possibile, ottenere i dati in un database.Quindi è possibile sfruttare tutto l'indicizzazione, la cache, la memoria pinning, e le altre funzionalità disponibili lì.

Se avete bisogno di accedere ai dati più di una volta, caricarlo in un database.La maggior parte dei database hanno un qualche tipo di caricamento di massa utilità.Se i dati possono rientrare nella memoria, e non c'è bisogno di mantenere o di accesso che spesso, probabilmente si può scrivere qualcosa di semplice in Perl o il vostro preferito linguaggio di scripting.

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