1-2分钟后在覆盆子pi上运行web服务器,我得到滞后。我使用nodeJS,socket.io和sqlite数据库。我怀疑这个:
io.sockets.on('connection', function(socket){
setInterval(function(){
fs.readFile('/sys/bus/w1/devices/'+ tempId +'/w1_slave', function(error, buffer){
// Read data from file (using fast node ASCII encoding).
var data = buffer.toString('ascii').split(" "); // Split by space
// Extract temperature from string and divide by 1000 to give celsius
var temp = parseFloat(data[data.length-1].split("=")[1])/1000.0;
// Round to one decimal place
temp = Math.round(temp * 10) / 10;
// Add date/time to temperature
var data = {
temp_irasai:[{
laikas: Date.now()+10800000,
laipsnis: temp
}]};
socket.emit('realtime', data);
var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?)");
statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis);
statement.finalize();
});
}, 8000);
});
然后我评论这一行:
var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?)");
statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis);
statement.finalize();
滞后消失了,所以这个功能出错了。
但它不起作用:
db.run("BEGIN TRANSACTION;");
var statement = db.prepare("INSERT INTO temp_irasai VALUES (?, ?);");
statement.run(data.temp_irasai[0].laikas, data.temp_irasai[0].laipsnis);
statement.finalize();
db.run("commit;");
答案 0 :(得分:2)
这是sqlite中一个非常常见的问题,已在FAQ中得到解答。有关详细信息,请查看https://www.sqlite.org/faq.html#q19。引用:
实际上,SQLite很容易在普通台式计算机上每秒执行50,000或更多INSERT语句。但它只会做一些 每秒十几笔交易。交易速度受到限制 磁盘驱动器的转速。交易通常需要 磁盘盘片的两个完整旋转,在7200RPM磁盘上 drive限制你每秒约60笔交易。
事务速度受磁盘驱动器速度的限制,因为(默认情况下)SQLite实际上等待数据确实安全存储 在事务完成之前在磁盘表面上。那样,如果 你突然断电或者你的操作系统崩溃,你的数据仍然存在 安全。有关详细信息,请阅读SQLite中的原子提交..
默认情况下,每个INSERT语句都是自己的事务。但是如果你用BEGIN ... COMMIT包围多个INSERT语句那么全部 插入数据被分组到一个事务中。需要的时间 提交事务在所有随附的插入中摊销 语句,因此每个插入语句的时间大大减少。
编辑:
要修复它,你要做的是在执行所有insert语句之前执行“BEGIN”和“COMMIT”。