H2数据库加载csv数据的速度更快

sfg*_*ups 6 h2

我想从CSV格式的文件加载大约200万行到数据库并运行一些SQL语句进行分析,然后删除数据.文件大小为2GB.数据是Web服务器日志消息.做了一些研究,发现H2内存数据库似乎更快,因为它将数据保存在内存中.当我尝试加载数据时因为32位java而得到OutOfMemory错误消息.计划尝试使用64位java.

我正在寻找所有优化选项来快速加载并运行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');
Run Code Online (Sandbox Code Playgroud)

在64位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
Run Code Online (Sandbox Code Playgroud)

如果在AIX中可以使用任何其他数据库,请告诉我.

谢谢

Tho*_*ler 5

如果CSV文件是2 GB,那么在使用纯内存数据库时,它将需要超过4 GB的堆内存.确切的内存要求很大程度上取决于数据的冗余程度.如果相同的值一遍又一遍地出现,那么数据库将需要更少的内存,因为常用对象被重用(无论它是字符串,长,时间戳,......).

请注意LOCK_MODE=0,UNDO_LOG=0LOG=0使用时不需要create table as select.此外, CACHE_SIZE使用mem:前缀时没有帮助(但它有助于内存文件系统).

我建议首先尝试使用内存中的文件系统(memFS:而不是mem:),这比稍慢mem:,但通常需要更少的内存:

jdbc:h2:memFS:test;CACHE_SIZE=65536
Run Code Online (Sandbox Code Playgroud)

如果这还不够,请尝试压缩的内存模式(memLZF:),它再次变慢但使用更少的内存:

jdbc:h2:memLZF:test;CACHE_SIZE=65536
Run Code Online (Sandbox Code Playgroud)

如果这仍然不够,我建议尝试常规持久模式,看看它有多快:

jdbc:h2:~/data/test;CACHE_SIZE=65536
Run Code Online (Sandbox Code Playgroud)