Я извлекаю более 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 слотов (или больше в реальности), чтобы я мог ограничить количество одновременных вызовов, но когда один из них завершается, вызывается следующий идентификатор.
Часть проблемы в том, что я даже не знаю, как сформулировать свой вопрос при поиске ответа! Я надеюсь, что кто-то может понять, чего я пытаюсь добиться, и помочь мне!
Спасибо,
Джо