Я пытаюсь пролистать свою базу данных, что включает использование результатов каждого запроса для запуска следующего запроса.
Когда я пишу запрос с циклом while
, как предложено в в этой статье моя память увеличивается почти на сто мегабайт в секунду, несмотря на то, что я собираю, но небольшое количество данных.
let startKey = null;
while (true) {
global.gc();
let results = (await pouch.find({
selector: {
type: 'app',
appId: {$gt: startKey},
},
fields: ['appId'],
limit: 50,
use_index: 'byAppId'
})).docs;
// Do some work...
if (results.length === 0) return;
startKey = results[results.length - 1].appId;
Если я последую совету той же статьи по использованию Bluebird, я также увижуогромный рост памяти:
function doStuff(startKey, acc) {
global.gc();
return BPromise.resolve(
pouch.find({
selector: {
type: 'app',
appId: {$gt: startKey},
},
fields: ['appId'],
limit: 50,
use_index: 'byAppId'
})
).then(({docs}) => {
if (docs.length === 0) return acc;
return doStuff(
startKey = docs[docs.length - 1].appId,
acc + docs.length
)
});
}
await Promise.resolve(doStuff(null, 0));
}
График распределения кучи Dev Tools показывает, что все собирается очень быстро, а объем кучи незначительный.И все же память процесса быстро растет.
Снимки кучи также показывают дельты распределения только КБ, когда объем памяти моего процесса вырос более чем на 1 ГБ между моментальными снимками.