当向数据库插入大量记录时,我应该如何编写节点脚本以最小化内存使用
how should I write my node script for minimal memory usage when inserting large numbers of records to a database?
假设我想生成一百万条记录并将它们插入到数据库中。如果需要一个小时,没问题。
我有一个生成虚假零售数据的库:
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,限制块中的数据量。
我是这样做的
相关文章:
- 为什么正文标记后的脚本标记在子节点中计数
- 公共脚本文件上的访问节点文件
- 为什么不't克隆节点<脚本>执行标记
- 不存在的XML节点破坏了我的脚本
- 如何从节点脚本中放入REPL
- 如何在节点上运行的脚本中使用 jsdoc.js
- 节点外壳脚本上没有这样的文件或目录
- 在节点脚本中,如何监视文件的更改并获取更新的内容
- 我的基于节点的咖啡脚本未运行(错误%1不是有效的应用程序.)
- 是否可以从网页运行节点脚本
- 将节点.js应用程序从 JavaScript 转换为咖啡脚本时出现无效字符和模块
- 在节点中运行 python 脚本.js语法错误
- 确定元素是否由 JS 添加,还是原始 HTML 文档 *OR* 检测脚本何时通过 InnerHTML 更新节点
- 节点.js脚本由于代理问题而失败
- 如何在java脚本中获取节点内部文本
- 节点.js版本已更改,脚本不再工作
- 如何执行脚本一次直到 if 变为假?(节点.JS)
- 如何等待脚本节点完成加载
- 无法动态添加脚本节点
- 添加<脚本>节点在body>From javascript in