Коллеги, структурный вопрос:
Есть функция. Внутри функции я решил сделать хранилище для накопления и обработки данных. Хранилищем выступает стейт мереджер effector. Работет всё здорово но.
Когд а я нагружаю систему, у меня приложение отжирает до 10 гб оперативы, и это не предел.
вот пример
{"processResidentSetSize":
4300.091
,"heapTotal":
1905.181
,"heapUsed":
1424.288
,"external":
1827.002
,"stack":
2394.911
}
Это в основном heap.
Иногда приложение вывалилватся изза недостатка памяти. Причём это случается в том же коде но при подключении к другим сокетам с такими же данными.
после изучения с помощью —trace_gc я вижу как куча набирается до 500 мб за считанные секунды, а потом приходит марк-свип и чистит до 90мб.
Я понимю что это может происходить только внутри эффектора.
Там у меня следующая конструкция.
const store = (allS, newD) => {
const groupedData = groupedFunc([..allS, …newD], 'price');
const gDataLen = groupedData.length;
const zeroFilter = [];
for (let i = 0; i < gDataLen; i++) {
groupedData[i].size !== 0 ? zeroFilter.push(groupedData[i]) : null;
};
return zeroFilter;
};
Нассколько я понимаю сначала я создаю массивы наполняю их данными, а потом теряю на них ссылку при следующей итерации.
что происходит в функции:
— на вход поступает 2 массива, новые данные и данные с прошлыми резальутатами.
— данные группируются. по цене
— дальше из сгруппированных данных отбрасываются объекты в которых size === 0
— валюдный массив (zeroFilter) отправляется в стор. То есть на следующей итерации он окажется в allS
Но данных с каждой итерацией всё больше и больше и получается что изначально всё смотрится норм, а потом оно разрастается изз растущего количества данных. Расти в объеме они будут не вечно, но наступит какой то момент когда данных приедет от сокета много и у меня приложение вывалится изза нехватки памяти.
Есь варианты оптимизировать этот процесс?