2013-04-03 12 views
6

Voglio caricare circa 2 milioni di file dal file CSV in formato database e eseguire alcune istruzioni SQL per l'analisi, quindi rimuovere i dati. La dimensione del file è di 2 GB. I dati sono messaggi di log del server web. Ha fatto qualche ricerca e trovato il database in memoria di H2 sembra essere più veloce, dal momento che mantiene i dati in memoria. Quando provo a caricare i dati ho ricevuto il messaggio di errore OutOfMemory a causa di 32 bit java. Pianificazione per provare con java a 64 bit.database H2 Carica dati csv più veloce

Sto cercando tutte le opzioni di ottimizzazione per caricare rapidamente ed eseguire SQL.

test.sql

CREATE TABLE temptable (
    f1 varchar(250) NOT NULL DEFAULT '', 
    f2 varchar(250) NOT NULL DEFAULT '', 
    f3 reponsetime NOT NULL DEFAULT '' 
) as select * from CSVREAD('log.csv'); 

esecuzione come questo in Java a 64 bit:

java -Xms256m -Xmx4096m -cp h2*.jar org.h2.tools.RunScript -url 'jdbc:h2:mem:test;LOG=0;CACHE_SIZE=65536;LOCK_MODE=0;UNDO_LOG=0' -script test.sql 

Se qualsiasi altro database a disposizione da utilizzare in AIX per favore fatemelo sapere.

grazie

risposta

5

Se il file CSV è di 2 GB, allora sarà bisogno di più di 4 GB di memoria heap quando si utilizza un database di puro in memoria. I requisiti di memoria esatti dipendono molto da quanto sono ridondanti i dati. Se gli stessi valori vengono visualizzati più e più volte, allora il database avrà bisogno di meno memoria man mano che gli oggetti comuni vengono riutilizzati (non importa se si tratta di una stringa, una data, un timestamp, ...).

Nota: LOCK_MODE=0, UNDO_LOG=0 e LOG=0 non sono necessari quando si utilizza create table as select. Inoltre, lo CACHE_SIZE non aiuta quando si utilizza il prefisso mem: (ma è utile per i file system in memoria).

suggerisco di provare a utilizzare il sistema di file in memoria prima (memFS: invece di mem:), che è leggermente più lento rispetto mem:, ma ha bisogno di meno memoria di solito:

jdbc:h2:memFS:test;CACHE_SIZE=65536 

Se questo non è sufficiente, provare la modalità compressa in memoria (memLZF:), che è ancora più lento, ma utilizza anche meno memoria:

jdbc:h2:memLZF:test;CACHE_SIZE=65536 

Se questo non è ancora abbastanza, vi suggerisco di provare la modalità persistente normale e guarda quanto è veloce:

jdbc:h2:~/data/test;CACHE_SIZE=65536 
Problemi correlati