Ich versuche, eine ganze sqlite3 Datenbank-Tabelle in CSV zu exportierenknex.js verwenden. Da die Tabelle bis zu 300000 Zeilen umfassen kann, verwende ich Streams, um keine Speicherprobleme zu haben. Aber wenn ich den Speicherverbrauch meiner App es bis zu 800 MB oder ich habe einen Fehler "nicht genügend Speicher".Speicherprobleme auf knex.js wenn Streams mit
Wie kann ich ein großes Abfrage-Ergebnis mit knex.js auf sqlite3 Datenbank handhaben?
Unterhalb einer Probe von Code:
knex.select().from(table).stream(function (stream) {
var stringifier = stringify(opts);
var fileStream = fs.createWriteStream(file);
var i = 0;
stringifier.on('readable', function() {
var row;
while (row = stringifier.read()) {
fileStream.write(row);
console.log("row " + i++); //debug
}
});
fileStream.once('open', function(fd) {
stream.pipe(stringifier);
});
});
EDIT
knex.js Streams für sqlite3 Datenbank Scheint sind "fake" Streams. Unter dem Quellcode der Stromfunktion für sqlite3 in Knex:
Runner_SQLite3.prototype._stream = Promise.method(function(sql, stream, options) {
/*jshint unused: false*/
var runner = this;
return new Promise(function(resolver, rejecter) {
stream.on('error', rejecter);
stream.on('end', resolver);
return runner.query(sql).map(function(row) {
stream.write(row);
}).catch(function(err) {
stream.emit('error', err);
}).then(function() {
stream.end();
});
});
});
Wir sehen, dass es wartet auf die Anforderung, bevor Sie den Strom aus dem Ergebnis-Array erstellen ausgeführt werden.
VERSION:
- Knex.Js 0.7.5
- Knoten 0,12
Thx für Ihre Hilfe.