gpt4 book ai didi

java - 优化批量插入,SQLite

转载 作者:IT王子 更新时间:2023-10-29 06:27:27 25 4
gpt4 key购买 nike

我正在尝试将不同的缓冲区大小插入到本地 SQLite 数据库中,发现当缓冲区大小为 10,000 时,插入 10,000,000 行数据需要将近 8 分钟。换句话说,需要 1,000 次写入才能存储所有内容。

8 分钟存储 10,000,000 似乎有点太长了(或者是这样?)

可以优化以下任何一项以提高速度吗?请注意,插入的数据是字符的随机集合。

public int flush() throws SQLException {
String sql = "insert into datastore values(?,?,?,?);";

PreparedStatement prep = con.prepareStatement(sql);

for (DatastoreElement e : content) { // content is 10,000 elements long
_KVPair kvp = e.getKvp();

prep.setInt(1, e.getMetaHash());
prep.setInt(2, kvp.hashCode());
prep.setString(3, kvp.getKey());
prep.setString(4, kvp.getValue());

prep.addBatch();
}

int[] updateCounts = prep.executeBatch();

con.commit();

return errorsWhileInserting(updateCounts);
}

创建表时通过

    statement.executeUpdate("create table datastore 
(meta_hash INTEGER," +
"kv_hash INTEGER," +
"key TEXT," +
"value TEXT);");

请问上面的任何一个都可以进一步优化吗?

最佳答案

我对 Java API 不太了解,但我认为您应该先启动一个事务,否则调用 commit() 是没有意义的。使用 conn.setAutoCommit(false) 来完成。否则 SQLite 将记录每个单独的插入/更新。这需要同步文件,这将导致速度变慢。

编辑:发问者更新说这已经设置为真。在那种情况下:

这是很多数据。这么长的时间听起来并不奇怪。您能做的最好的事情就是使用不同的缓冲区大小进行测试。它们太小导致的缓冲区抖动与大尺寸的虚拟内存之间存在平衡。出于这个原因,您不应该尝试一次将它们全部放入一个缓冲区。将插入物分成您自己的批处理。

关于java - 优化批量插入,SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com