Проблемы со скоростью, зацикливающиеся на вызовах API-интерфейса node-fetch - есть ли лучший способ?

Я извлекаю более 7 миллионов записей из API, используя fetch-node в скрипте node js.

Каждая запись имеет последовательный идентификатор, начинающийся с 1, поэтому я использую цикл for для доступа к каждой записи. У меня главная проблема это скорость!

Сначала я делал по одному, но я пытался использовать promise all, чтобы делать их партиями (см. код ниже), что значительно повысило скорость, но я думаю, что должен быть более эффективный способ сделать это.

(async () => {

    const start = 1;
    const records_to_fetch = 7000000;
    const finish = start + records_to_fetch + 1;

    for(i = start; i < finish; i += 5) {
        
        await Promise.all([
            getHistory(i),
            getHistory(i+1),
            getHistory(i+2),
            getHistory(i+3),
            getHistory(i+4),
        ]);
        
    };
}

})();

Без promise.all API не может обрабатывать объем запросов при пакетном выполнении, однако, поскольку каждый вызов функции не зависит друг от друга, мне не нужно, чтобы все 5 завершались перед запуском следующего. В идеале у меня было бы 5 слотов (или больше в реальности), чтобы я мог ограничить количество одновременных вызовов, но когда один из них завершается, вызывается следующий идентификатор.

Часть проблемы в том, что я даже не знаю, как сформулировать свой вопрос при поиске ответа! Я надеюсь, что кто-то может понять, чего я пытаюсь добиться, и помочь мне!

Спасибо,

Джо


person joecampbelluk    schedule 15.12.2020    source источник
comment
futurestud.io/tutorials/node-js-run-async- пакетные функции   -  person Manos Kounelakis    schedule 15.12.2020
comment
Также вы уверены, что API, из которого вы извлекаете данные, не имеет конечной точки, которая делает это? Кажется излишним как для потребителя (вас), так и для производителя (API).   -  person Manos Kounelakis    schedule 15.12.2020
comment
Привет, Манос, спасибо за ответ! К сожалению, единственная конечная точка, в которой есть нужные мне данные, доступна только через идентификатор человека. Простите мне отсутствие знаний (я новичок в кодировании), но как мне запустить цикл for с использованием пула обещаний? Кажется, для этого требуется массив, но у меня будет более 7 миллионов элементов, что кажется излишним....   -  person joecampbelluk    schedule 15.12.2020