2013-04-03 25 views
6

Chcę załadować około 2 miliony wierszy z pliku w formacie CSV do bazy danych i uruchomić trochę instrukcji SQL do analizy, a następnie usunąć dane. Rozmiar pliku to 2 GB. Dane to komunikat dziennika serwera WWW. Zrobiłem trochę badań i okazało się, że baza danych H2 w pamięci wydaje się szybsza, ponieważ zachowuje dane w pamięci. Kiedy próbuję załadować dane otrzymałem komunikat o błędzie OutOfMemory z powodu 32-bitowego java. Planuję wypróbować 64-bitową wersję Java.Baza danych H2 Szybsze ładowanie danych CSV

Szukam wszystkich opcji optymalizacji, aby szybko załadować i uruchomić 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'); 

Running tak w 64 bitowym Java:

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 

Jeśli jakakolwiek inna baza danych dostępna do wykorzystania w systemie AIX proszę dać mi znać.

dzięki

Odpowiedz

5

Jeśli plik CSV wynosi 2 GB, to będzie potrzebować więcej niż 4 GB pamięci sterty przy użyciu czystej bazy danych w pamięci. Dokładne wymagania dotyczące pamięci zależą w dużej mierze od tego, jakie dane są zbyteczne. Jeśli te same wartości pojawiają się w kółko, baza danych będzie potrzebować mniej pamięci, ponieważ zwykłe obiekty są ponownie używane (bez względu na to, czy jest to ciąg znaków, długa, sygnatura czasowa, ...).

Należy pamiętać, że LOCK_MODE=0, UNDO_LOG=0 i LOG=0 nie są potrzebne podczas korzystania z create table as select. Ponadto, CACHE_SIZE nie pomaga przy korzystaniu z prefiksu mem: (ale pomaga systemom plików w pamięci).

Proponuję wypróbować pierwszy system w pamięci pliku (memFS: zamiast mem:), który jest nieznacznie wolniejszy niż mem:, ale wymaga mniej pamięci zwykle:

jdbc:h2:memFS:test;CACHE_SIZE=65536 

Jeśli to nie wystarczy, spróbuj sprężone trybie in-memory (memLZF:), który jest wolniejszy, ale ponownie wykorzystuje nawet mniej pamięci:

jdbc:h2:memLZF:test;CACHE_SIZE=65536 

Jeśli to wciąż za mało, proponujemy spróbować regularny tryb uporczywy i zobacz, jak szybko to jest:

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