H2数据库加载csv数据更快

Posted

技术标签:

【中文标题】H2数据库加载csv数据更快【英文标题】:H2 database Load csv data faster 【发布时间】:2013-04-03 01:00:14 【问题描述】:

我想从 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】:

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

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

我建议先尝试使用内存文件系统(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

【讨论】:

以上是关于H2数据库加载csv数据更快的主要内容,如果未能解决你的问题,请参考以下文章

加载位于 H2 数据库的类路径中的 CSV 文件

Pandas 加载 CSV 比加载 SQL 更快

无法将大型数据集加载到 h2 数据库中

如何在 C++ 中使 csv 文件运行得更快

h2创建数据库语句

H2 数据库 CSVREAD 和日期转换