Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

167
Views
Fuga de memoria al insertar datos en SQLite con un controlador better-sqlite3

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)

about 4 years ago · Juan Pablo Isaza
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!