我有一些带有以下列的平面文件;3 个整数、3 个实数和 1 个 varchar(20)。对于查询,我需要一个包含 1 个整数列和 varchar 列的索引。每个文件大小约为 1.8GB,行数约为 3800 万。
目前我正在使用 HSQL(Standalone) 数据库来加载文件进行处理;每个文件一个数据库。当使用以下选项创建数据库时,加载文件非常慢(120+ 分钟)并导致 4.7GB 的数据库文件。
"Properties" -> {
"check_props" -> "true",
"shutdown" -> "true",
"hsqldb.default_table_type" -> "cached",
"sql.syntax_mss" -> "true",
"hsqldb.log_data" -> "false",
"hsqldb.inc_backup" -> "false"
}
该文件分批读取 100k 条记录。阅读速度非常快(几乎是即时的),所以我不认为是阅读让事情变慢了。关闭与数据库的连接也需要很长时间。
我可以选择使用 Derby、H2 或 SQLite。在这种情况下,这些是否会导致更快的加载时间和/或更小的数据库文件大小?如果是这样,应该使用哪些连接字符串选项来实现此目的?或者,是否有不同的连接字符串选项可以与 HSQL(Standalone) 一起使用,以减少加载时间和/或数据库文件大小?
添加了驱动程序信息。
JDBCDriver[
"Name" -> "HSQL(Standalone)",
"Driver" -> "org.hsqldb.jdbcDriver",
"Protocol" -> "jdbc:hsqldb:file:",
"Version" -> 3.1,
"Description" -> "HSQL Database Engine (In-Process Mode) - Version 2.3.3 - This ...",
"Location" -> "C:\... "]
我可用的其他选项的驱动程序信息。
德比
JDBCDriver[
"Name" -> "Derby(Embedded)",
"Driver" -> "org.apache.derby.jdbc.EmbeddedDriver",
"Protocol" -> "jdbc:derby:",
"Version" -> 3.1,
"Description" -> "Derby Database Engine (Embedded Mode) - Version 10.12.1.1 - This...",
"Location" -> "C:\... "]
H2
JDBCDriver[
"Name" -> "H2(Embedded)",
"Driver" -> "org.h2.Driver",
"Protocol" -> "jdbc:h2:",
"Version" -> 3.1,
"Description" -> "H2 Database Engine (Embedded Mode) - Version 1.3.176 - This...",
"Location" -> "C:\... "]
SQLite
JDBCDriver[
"Name" -> "SQLite",
"Driver" -> "org.sqlite.JDBC",
"Protocol" -> "jdbc:sqlite:",
"Version" -> 3.1,
"Description" -> "SQLite using Zentus-derived JDBC Driver - Version 3.8.11.2",
"Location" -> "C:\..."]
其他变体包括以下内容。但是,我需要它在客户端的计算机上运行。我相信这不包括服务器和网络服务器模式。
{"Derby(Embedded)", "Derby(Server)", "H2(Embedded)", "H2(Memory)",
"H2(Server)", "HSQL(Memory)", "HSQL(Server)", "HSQL(Standalone)",
"SQLite", "SQLite(Memory)"}
您需要更大的 Java 内存分配和更大的 HSQLDB 内存缓存大小,以便更快地将数据加载到大型表中。
hsqldb.cache_rows=4000000
将和添加hsqldb.cache_size=1000000
到新数据库的启动配置中。http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_db_file_mem