H2数据库快速加载CSV数据

6
我希望将一份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');

在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

如果AIX中还有其他可用的数据库,请告诉我。谢谢。
1个回答

5
如果CSV文件大小为2GB,则纯内存数据库使用时需要超过4GB的堆内存。确切的内存需求取决于数据的冗余程度。如果相同的值一遍又一遍地出现,那么由于通用对象被重复使用(无论是字符串、长整型、时间戳还是其他数据类型),数据库将需要更少的内存。
请注意,在使用“create table as select”时,不需要使用LOCK_MODE=0UNDO_LOG=0LOG=0。此外,当使用mem:前缀时,CACHE_SIZE对内存不起作用(但对内存文件系统有帮助)。
我建议首先尝试使用内存文件系统(memFS:而不是mem:),它略慢于mem:但通常需要更少的内存。
jdbc:h2:memFS:test;CACHE_SIZE=65536

如果这不够用,可以尝试压缩内存模式(memLZF:),虽然速度更慢但使用的内存更少。
jdbc:h2:memLZF:test;CACHE_SIZE=65536

如果还不够,请尝试正常的持久模式,看看速度如何:
jdbc:h2:~/data/test;CACHE_SIZE=65536

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接