Приложение NODE.JS застревает, получая 2,5 миллиона записей и API - PullRequest
0 голосов
/ 14 октября 2018

У меня есть код, который извлекает пару миллионов строк из БД и пару миллионов через API.

            let closedOrdersStartDate;
            preparedOrdersPromise = tickApiConnector.obtainToken().then(function () {
                return ordersController.getAllTrades(0, [], 0, accountIdsToRun);
            }).then(function (trades) {
                closedOrdersStartDate = new Date();
                return Promise.all([trades, fthsApiConnector.getData('closed_orders', '&sort=id', 10000, 0)]);
            }).then(function (tradesAndClosedOrderIds) {
                //stuck before getting there
                console.log('now processing orders time spent from starting getting closed_orders till now is: ' +
                  ((new Date().getTime() - closedOrdersStartDate.getTime())/ 1000) + ' seconds');
                return ordersController.processOrders(tradesAndClosedOrderIds[0], tradesAndClosedOrderIds[1]);
            });

Приложение застревает после вызова этой getData() функции.

getData: async function (entityName, getParams = '', perRequest = 10000, skip = 0) {
  if(getParams.indexOf('&take=') !== -1) {
    return fthsApiRequest(entityName, getParams);
  }

  const totalCount = await fthsApiRequest(entityName, getParams + '&getCount');

  let result = [];
  let count = 0;
  while(count < totalCount) {
    result = result.concat(await fthsApiRequest(entityName, getParams + '&take=' + perRequest + '&skip=' + count));
    count += perRequest;
  }

  return result;
}

Функция выполняется до последнего запроса (я вижу это в журналах), и после этого скрипт получаетunresponsable.Я подумал, что это может быть утечка памяти, и я переписал, что getData () функционирует по-разному, но все же, на сервере достаточно памяти, и скрипт не потребляет даже ее части.Тем не менее, через некоторое время после последней итерации getData () разглагольствует.После этого приложение застревает навсегда.

Я попытался его профилировать.И есть тысячи событий перемещения кода для неизвестного кода: 0x2a5c24bfb4c0 , я не уверен, что это значит, но в этом может быть ключ.Вот V8.log

1 Ответ

0 голосов
/ 14 октября 2018

Возможная проблема может быть в блоке:

while(count < totalCount) { result = result.concat(await fthsApiRequest(entityName, getParams + '&take=' + perRequest + '&skip=' + count)); count += perRequest; }

Убедитесь, что API дает ответ.И на последнем утверждении:

return result;

В асинхронной функции лучше использовать:

return Promise.resolve(result);
...