Puede que me equivoque, pero creo que hay una pérdida de memoria cuando intento insertar unas 300 filas cada 3 segundos. Lo probé en el hilo principal y en un hilo de trabajo, pero ambos muestran una pérdida de memoria clara. No estoy seguro de si esto está relacionado con SQLite o el controlador.
Estoy leyendo datos de un sensor a 100 muestras/segundo y me gustaría almacenarlos en una base de datos. Al principio pensé que podría ser el procesamiento de los datos lo que causa la fuga, pero una vez que apagué todo e intenté insertar algunos datos ficticios en un intervalo, vi el mismo problema. Mi aplicación se ejecuta en el marco ElectronJS. Ya he reconstruido el paquete better-sqlite3 para mi versión actual de electron.
Aquí hay un código de muestra que ejecuto en un subproceso de trabajo de NodeJS que muestra una pérdida de memoria clara.
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);Otras posibles soluciones que he probado
Intenté exponer global.gc() y ejecutarlo después de cada inserción de los datos. También intenté ejecutar este script en el hilo principal y obtuve el mismo resultado. He intentado recrear mi archivo de base de datos muchas veces, pero eso tampoco ayuda. No estoy seguro de lo que estoy haciendo mal aquí. Realmente agradecería si pudiera ayudarme con este asunto.
Aquí está mi configuración: SO: Windows 10, Node v16.9.1 Electron Versión: 16.0.8 Better-sqlite3 Versión: 7.5.0 (también probé versiones anteriores como 7.4.0)