当向数据库插入大量记录时,我应该如何编写节点脚本以最小化内存使用

how should I write my node script for minimal memory usage when inserting large numbers of records to a database?

本文关键字:脚本 节点 何编写 最小化 内存 我应该 插入 数据库 记录      更新时间:2023-09-26

假设我想生成一百万条记录并将它们插入到数据库中。如果需要一个小时,没问题。

我有一个生成虚假零售数据的库:

var records = retailGen.generateOrders(numberOfRecords);

OK,没问题,它可以相当快地生成一百万条记录。当我将大量记录排队并循环它们(每个记录包含一个或多个事务,insertTransaction是对db的异步调用)时,问题就出现了:

  _fn = function(record) {
    var transaction, _j, _len, _ref, _results;
    _ref = record.transactions; 
    for (_j = 0, _len = _ref.length; _j < _len; _j++) {
      transaction = _ref[_j];
      insertTransaction(transaction); 
    } 
  };
  for (n = _i = 0; 0 <= runs ? _i < runs : _i > runs; n = 0 <= runs ? ++_i : --_i) {
    _fn(records[n]);
  }

它会把所有异步调用堆起来,占用内存,最终阻塞操作系统,让我什么都做不了。我想知道更有经验的js程序员如何处理这个问题。这个脚本是有效的,但是当数字变大时就不太管用了。

我更喜欢用纯js来解决这个问题,而不是一个库——这将是一个更好的学习经验。我考虑过将下一条记录的插入放在第一次插入的"done"回调中,但感觉就像我强迫节点同步(好吧,有点同步)。

当我首先插入"硬收集"的大数据量时,我倾向于将它们交给php脚本,分成均匀的部分,并将其放入文件中。

现在,这听起来可能浪费资源,但实际上,序列化数据不会出错。所以在这之前,没有东西会破裂。我想通过收集大量的数据,你可以得到意想不到的"东西"。

然后逐行获取序列化文件,反序列化并插入。

如果中间有什么东西坏了:我有重现错误的数据,不会发生数据丢失。

我可以设置睡眠以节省CPU,限制块中的数据量。

我是这样做的