当前位置: 首页 > 面试题库 >

优化批量插入,SQLite

翟鸿振
2023-03-14
问题内容

我在将不同的缓冲区大小插入到本地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。在这种情况下:

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



 类似资料:
  • 我需要使用JDBC在Oracle数据库中进行大量插入,即两位数百万。为此,我使用了类似于以下类的东西,灵感来自使用JDBC进行批处理插入的高效方法: 虽然这种插入方式很好,但速度非常慢。JDBC batch insert performance描述了MySQL基本上可以解决这个问题,因为在Oracle上似乎不存在,但在这里没有太大帮助。 为了提高性能,我还尝试将语句切换为一个大的

  • 问题内容: 我需要通过REST API的Batch端点将大量节点及其之间的关系插入到Neo4j中,大约每秒5k记录(仍在增加)。 这将是24x7连续插入。每条记录可能只需要创建一个节点,而其他记录可能需要两个节点并创建一个关系。 是否可以通过更改程序或修改Neo4j的设置来提高插入件的性能? 到目前为止,我的进度: 1.我已经使用Neo4j进行了一段时间的测试,但无法获得所需的性能 测试服务器盒:

  • 问题内容: 我试图切换一些硬编码的查询以使用参数化输入,但是遇到一个问题:如何格式化参数化批量插入的输入? 当前,代码如下所示: 一个可能的解决方案(从如何将数组插入到一个带有PHP和PDO的单个MySQL Prepared语句中 修改而来)似乎是: 有没有更好的方法来完成带有参数化查询的批量插入? 问题答案: 好吧,您有三个选择。 一次构建-执行多次。基本上,您只需为一行准备一次插入,然后循环执

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 问题内容: 我有一个脚本,它通过自定义ORM生成数以万计的插入Postgres数据库中。可以想象,它非常慢。这用于开发目的,以便创建伪数据。我可以在Postgres级别上进行简单的优化以使其更快吗?它是唯一按顺序运行的脚本,不需要线程安全。 也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一种快速而肮脏的解决方案,可以大大加快这一过程。 谢谢。 问题答案: 如果您在生产环境中不需要这种功能,建

  • 问题内容: 这是我在阅读有关jpa批量插入的几个主题之后创建的简单示例,我有2个持久对象User和Site。一个用户可以拥有多个站点,因此我们在这里有一对多的关系。假设我要创建用户并将多个站点创建/链接到用户帐户。考虑到我愿意为Site对象使用批量插入,代码如下所示。 但是,当我运行此代码时(我将hibernate方式用作jpa实现提供程序),我看到以下sql输出: 所以,我的意思是“真实的”批量