Обещание петли утечки памяти - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь пролистать свою базу данных, что включает использование результатов каждого запроса для запуска следующего запроса.

Когда я пишу запрос с циклом 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 показывает, что все собирается очень быстро, а объем кучи незначительный.И все же память процесса быстро растет.heap allocation timeline

Снимки кучи также показывают дельты распределения только КБ, когда объем памяти моего процесса вырос более чем на 1 ГБ между моментальными снимками.heap snapshots

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...