【发布时间】:2018-04-13 15:01:39
【问题描述】:
我有一个用 Nodejs 编写的系统,首先必须将记录从非常大的 csv 文件导入数据库。使用Sequelize 作为我的 ORM,我创建了一个简单的模型,如下所示:
"use strict";
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mm', 'root', 'password', {
host: 'localhost',
dialect: 'mysql',
logging: true,
pool: {max: 5, min: 0, idle: 100000},
});
const Index = sequelize.define('index', {
value: {type: Sequelize.FLOAT}
});
然后我编写了以下代码来循环文件中的行,解释这些行,并将它们写入数据库:
let readline = require('readline');
let moment = require('moment');
let lineReader = readline.createInterface({
input: require('fs').createReadStream('files/price_index.csv')
});
lineReader.on('line', function (line) {
let splitted = line.split(',');
let dt = moment(parseInt(splitted[0]));
let value = parseFloat(splitted[1]);
console.log(dt.format(), value);
Index.create({value: value, createdAt: dt});
});
这工作正常,但每 3120 条记录后它会暂停大约 3 秒。我尝试了 sqlite 和 mysql,但它总是在恰好 3120 条记录后暂停。
看到 Sequelize 也在这 3120 条记录之后开始记录插入查询,我认为这种行为的原因是某种缓存机制,它将所有查询放在一个队列中,直到它无事可做,或者如果它达到了 3120 条记录的神奇查询缓存限制。
我尝试在 Sequelize 的初始化中增加 pool.max 数字,但这似乎没有任何区别。
谁能确认我的缓存想法,或者解释一下这种行为的真正原因是什么?我可以以某种方式改变这种行为,使其具有一致的吞吐量吗?欢迎所有提示!
【问题讨论】:
标签: mysql node.js sqlite caching sequelize.js