我可能错了,但我相信当我尝试每 3 秒插入大约 300 行时会发生内存泄漏。我已经在主线程和工作线程中尝试过,但都显示出明显的内存泄漏。我不确定这是否与 SQLite 或驱动程序有关。
我正在以每秒 100 个样本的速度从传感器读取数据,并希望将其存储在数据库中。起初我认为可能是数据处理导致泄漏,但是一旦我关闭所有内容并尝试在间隔内插入一些虚拟数据,我就看到了同样的问题。我的应用程序在 ElectronJS 框架上运行。我已经为我当前版本的电子重建了 better-sqlite3 包。
这是我在 NodeJS 工作线程中运行的示例代码,它显示了明显的内存泄漏。
const { isMainThread, workerData, parentPort } = require('worker_threads');
const path = require('path');
const SQLITE = require('better-sqlite3');
const dbPath = path.join(__dirname, 'mydb.db');
const db = new SQLITE(dbPath, {
timeout: 1000,
});
db.exec('CREATE TABLE IF NOT EXISTS sensor_data (id INTEGER PRIMARY KEY AUTOINCREMENT, timeStamp INTEGER, PDRawData TEXT, LEDIntensities TEXT, gainValues TEXT, events TEXT, recordingId INTEGER);
');
const pragma1 = db.pragma('journal_mode = WAL');
const pragma2 = db.pragma('synchronous = normal');
const insert = db.prepare(
'INSERT INTO sensor_data (timeStamp, PDRawData, LEDIntensities, gainValues, events, recordingId ) VALUES (@timeStamp, @PDRawData, @LEDIntensities, @gainValues, @events, @recordingId)'
);
const insertMany = db.transaction((data) => {
for (const dataPoint of data) {
insert.run(dataPoint);
}
});
const sampleData = {
timeStamp: 0,
PDRawData: '12313,123123,12313,1243535,3456464,213132,42342',
LEDIntensities: '123,435,123,4345,123,3435,132,345',
gainValues: null,
events: null,
recordingId: null,
};
const myData = Array(50).fill(sampleData);
setInterval(() => {
insertMany(myData);
}, 500);
我尝试过的其他可能的解决方案
我尝试公开 global.gc() 并在每次插入数据后运行它。我还尝试在主线程上运行此脚本,但仍然得到相同的结果。我曾多次尝试重新创建我的数据库文件,但这也无济于事。我不确定我在这里做错了什么。如果您能帮忙解决这个问题,我将不胜感激。
这是我的设置:操作系统:Windows 10,Node v16.9.1 Electron 版本:16.0.8 Better-sqlite3 版本:7.5.0(我也测试过以前的版本,例如 7.4.0)