У меня есть код, который извлекает пару миллионов строк из БД и пару миллионов через 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