Node.js 处理大型json时插入数据库

Node.js 处理大型json时插入数据库,node.js,knex.js,Node.js,Knex.js,我正在尝试将数据从大型json文件导入SQL数据库。 当前实现是使用node.js可读流逐行读取,然后使用knex.js暂停流进行异步插入 const fs = require('fs'); const JSONStream = require('JSONStream'); const environment = process.env.NODE_ENV || 'development'; const config = require('./knexfile')[environment]; co

我正在尝试将数据从大型json文件导入SQL数据库。 当前实现是使用node.js可读流逐行读取,然后使用knex.js暂停流进行异步插入

const fs = require('fs');
const JSONStream = require('JSONStream');
const environment = process.env.NODE_ENV || 'development';
const config = require('./knexfile')[environment];
const knex = require('knex')(config);

const stream = fs.createReadStream('books.json', {encoding: 'utf8'})

stream
  .pipe(JSONStream.parse('*'))
  .on('data', (data) => {
        stream.pause();

        knex('books').insert(data)
              .then((res) => {
                    stream.resume()
                    console.log(res)
              })
  });
这种方法的问题是,每次插入连接的数量都会增加,并且knex不会在每次插入后删除sql连接

  knex:pool INFO pool sqlite3:sqlite3:client0 - dispense() clients=956 available=0 +1ms

有没有合适的方法使用大型json中的流插入数据?

我对sqlite3或knex没有太多经验,但我相信knex在逐个插入数千行时不会很有效。您可能希望看到的是使用sqlite3本机驱动程序并使用事务进行大容量插入(注意,由于每个插入都被视为事务,这会增加不必要的开销,所以w/o事务的速度要慢得多)尝试搜索“nodejs sqlite3大容量插入”当我在Python中执行此操作时,我会遇到类似的问题。通常情况下,每N个条目我都会创建并关闭光标和连接,然后打开一个新的集合。@Molda knex也支持批量插入,但在执行这种一次性导入时,通常需要500毫秒或5秒并不重要。另一件事是,在单个事务中进行插入也可能会比较慢,因为DB必须跟踪更改,并准备在必要时允许回滚更改。如果不尝试一下,就无法确定是否有速度优势。无论如何,如果出现问题,使用事务可以回滚所有内容不是个坏主意,但在这种情况下,除非sqlite base中存在现有数据,否则这可能无关紧要。@plugataryov yura我无法通过简单for循环触发1000个并发查询来重现这一点(计数先上升,然后下降)... 我稍后会用你的代码试试。您的knex版本和sqlite配置是什么?下面是复制此问题的虚拟PoC应用程序,生成json 10k记录并使用batch-insert.js进行复制