Come elaborare enormi quantità di dati con risorse di elaborazione limitate? [chiuso]

1

Ricevo quotidianamente da una fonte esterna una grande quantità di dati (circa 250 GB con 260 milioni di righe di testo a larghezza fissa) distribuiti su 5 file di testo. Sto scrivendo un'applicazione Java che dovrebbe combinare un primo gruppo di dati (file 1-4) con un secondo gruppo (file 5) basato su alcune logiche di business.

Ma accedere / leggere più volte da 250 GB di file di testo richiede molto tempo. Così ho deciso di trovare un modo più efficiente per elaborare i miei dati. Penso di memorizzare i dati in un database (ad esempio mysql Workbench) e di eseguire l'elaborazione utilizzando il database anziché i file di testo. Questo database verrebbe eliminato dopo l'elaborazione.

Questo approccio all'utilizzo di un database temporaneo potrebbe migliorare le prestazioni rispetto ai file di testo? O ci sono suggerimenti migliori su come progettare questa elaborazione di massa?

Nota: la mia applicazione deve essere eseguita su Windows R2 Server con 32 GB di RAM, un processore Intel Xeon E5645 e un disco rigido da 1 TB

    
posta KicksheepSon 07.09.2018 - 12:58
fonte

2 risposte

3

È difficile dare una risposta semplice senza sapere in che modo i 4 primi file sono correlati tra loro, in che modo la logica aziendale combina i dati e se è possibile assumere qualsiasi ipotesi sull'ordinazione dei file. Tuttavia, ecco alcune idee generali per aiutarti a valutare te stesso l'approccio che consideri.

I tuoi dati sono di lunghezza fissa, il che significa facile analisi, confronto e conversione per l'approccio dei file e l'approccio al database.

Il database richiede l'importazione di tutti i dati prima di iniziare l'elaborazione. Ciò significa analizzare e convertire tutti i campi di input di tutti i file. Ciò significa anche creare indici per campi che richiedono una ricerca veloce. Questo potrebbe significare infine un overhead aggiuntivo per la gestione dell'integrità delle transazioni.

Questo overhead può essere ridotto a icona:

  • Se si dispone solo di alcuni indici, il costo della loro creazione dovrebbe in linea di principio essere inferiore rispetto all'ordinamento dei file di testo (poiché l'ordinamento dei file di testo richiede diverse riscritture complete di tutti i dati).

  • Le tabelle di database temporanee possono essere definite come aventi solo i campi rilevanti per la business logic, il promemoria di ogni riga di testo di input inserita in campi di testo di dimensioni fisse di grandi dimensioni. Ciò potrebbe ridurre l'overhead di conversione (ad esempio date, numeri, ...) durante l'importazione al minimo e in linea di principio allo stesso livello della conversione del testo nei file da solo. Ciò ridurrebbe anche le operazioni interne del database durante il recupero delle righe (più campi, più tempo è necessario per creare i dataset interni in memoria).

  • Molti database hanno una funzionalità di caricamento collettivo che consente di disabilitare temporaneamente l'integrità della transazione durante l'importazione, riducendo ulteriormente una delle pesanti attività di caricamento.

I motori di database hanno funzionalità che possono accelerare significativamente l'elaborazione dei dati:

  • L'uso di indici di database può evitare di leggere ripetutamente grandi parti di file solo per individuare alcuni record e aumentare significativamente le prestazioni (eccetto se i file di testo sono ordinati in base allo stesso campo).

  • In generale, un Query Optimizer ottimizza automaticamente le query (che richiederebbe un'analisi manuale accurata senza di essa).

  • Gli algoritmi di caching del database vengono utilizzati per ottimizzare l'accesso (in particolare l'accesso ripetuto).

Conclusione : a meno che i tuoi file di testo non siano ordinati in base ai criteri della logica di raggruppamento e a meno che non sia possibile trovare un algoritmo a passaggio singolo per combinare i dati, ci sono alte probabilità che l'accesso al database abilitare a sovraperformare l'approccio del file di testo grezzo.

Nota importante: la parte più pesante e delicata dell'approccio al database sarà l'importazione (in particolare con la tua macchina precedente). Fortunatamente, è possibile valutare la fattibilità di questo approccio con uno sforzo molto limitato: definire la struttura del database, utilizzare il motore sql con cui si ha familiarità e provare a utilizzare mysqlimport .

    
risposta data 08.09.2018 - 16:43
fonte
-1

Sei un po 'breve sul tipo di elaborazione che devi eseguire su quei file di testo. Ma molto probabilmente non si desidera utilizzare un sistema di database relazionale come strumento di elaborazione. Ciò ti costerebbe un sacco di memoria extra, spazio su disco e potenza / tempo di elaborazione. Vuoi toccare i dati non più spesso di quanto ti serva.

Puoi maggio voler memorizzare i risultati intermedi in un sistema di database relazionale, ma dovrebbero già essere interpretati i dati dai tuoi file di testo non elaborati, mappati ai codici più piccoli possibili. Potresti avere un campo COUNTRY nei tuoi file flat, se non hai più di un centinaio di possibili paesi potresti mapparlo ad un singolo enum di byte, per esempio. Forse conosci in anticipo tutti i paesi validi, quindi puoi codificare un dizionario nel tuo programma e determinare l'enumerazione mentre lo passi leggendo il file. Guarda come la conoscenza che hai dei dati che ottieni può aiutarti a ottimizzare l'elaborazione.

Cerca di fare il più possibile in una sola passata, leggendo i file 1-4 alternati al file 5, combinando i dati mentre vai, se possibile. Qualunque cosa tu possa ignorare dopo aver letto su di esso una volta è una vittoria.

Quindi potresti essere in grado di lavorare con le persone che forniscono i dati. Probabilmente non sarai interessato a tutto ciò. Potrebbero essere in grado di filtrare o condensare le cose per te alla fonte. Ora sarebbe agile!

    
risposta data 10.09.2018 - 23:06
fonte

Leggi altre domande sui tag