java - 优化批量插入,SQLite

标签 java sqlite

我正在尝试将不同的缓冲区大小插入到本地 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/

相关文章:

java - 如何使用 LIKE SelectionArgs 将 rawQuery() 转换为 query()

Java - JDBC 驱动程序 SQLite 3.7.2 - 无法打开数据库 test.db : file is encrypted or is not a database

Java 编码风格 - 调用类内的方法

java - 静态赋值调用该方法两次

java - 从扩展泛型中提取泛型类型

java - ObjectMapper readValue 类型从 LinkedHasMap 转换为自定义类型

java - Spring - 发送对象列表以查看并返回到仅在 Controller 中发布一个对象

javascript - PhoneGap中读写sqlite数据库同步(Android和JavaScript)

android - 如何将 SQLite 中的数据存储在 2D Arraylist 中?

asp.net - 无法访问 Azure Web App 上的 SQLite DB