优化批量插入,SQLite

Jam*_*sev 5 java sqlite

我正在使用不同的缓冲区大小插入本地SQLite DB,并发现当缓冲区大小为10,000时,插入10,000,000行数据需要将近8分钟.换句话说,它需要1,000次写入来存储所有内容.

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

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

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);
}
Run Code Online (Sandbox Code Playgroud)

创建表时,通过完成

    statement.executeUpdate("create table datastore 
               (meta_hash INTEGER," + 
               "kv_hash   INTEGER," + 
               "key TEXT," +
               "value TEXT);");
Run Code Online (Sandbox Code Playgroud)

可以进一步优化上述任何一项吗?

Joe*_*Joe 13

我对Java API有点朦胧,但我认为你应该先启动一个事务,否则调用commit()是没有意义的.做到这一点conn.setAutoCommit(false).否则,SQLite将为每个插入/更新进行日志记录.这需要同步文件,这将导致缓慢.

编辑:提问者更新说,这已经设置为真.在这种情况下:

这是很多数据.那段时间听起来不是这个世界.您可以做的最好的事情是使用不同的缓冲区大小进行测试.它们之间的缓冲抖动太小而虚拟内存对于大尺寸而言是平衡的.因此,您不应该尝试将其全部放入一个缓冲区中.将插入物拆分成您自己的批次.