优化批量插入,SQLite

我在将不同的缓冲区大小插入到本地SQLite

DB中时发现,当缓冲区大小为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将为每个单独的插入/更新记录日志。这需要同步文件,这将导致速度变慢。

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

那是很多数据。这段时间听起来并不遥远。最好的办法是使用不同的缓冲区大小进行测试。缓冲区抖动过小和虚拟内存因大小过大而存在平衡。因此,您不应该尝试一次将它们全部放入一个缓冲区。将插入物分成自己的批次。

以上是 优化批量插入,SQLite 的全部内容, 来源链接: utcz.com/qa/426735.html

回到顶部