Skip to content

Instantly share code, notes, and snippets.

@alex-samborskiy
Created January 30, 2020 11:46
Show Gist options
  • Select an option

  • Save alex-samborskiy/b6e4c76b0f54898fbfdcc1bdbab14b87 to your computer and use it in GitHub Desktop.

Select an option

Save alex-samborskiy/b6e4c76b0f54898fbfdcc1bdbab14b87 to your computer and use it in GitHub Desktop.
[task qith memody usage] #task
/**
всем привет. просьба к опытным разрабам: помогите решить проблему плс.
задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла.
проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только rss, в то время как heap стабильно очищается. как видно в логах после полной прогрузки файла и выхода из функции main (по идее все ссылки на dataStream должны очиститься garbage collector-ом) rss все еще занимает 64mb. в реальном проекте таких файлов много и желательно обрабатывать их параллельно, но из-за того что использование памяти постоянно растет, приложение просто падает.
вопрос: почему так происходит (может это баг ноды?) и можно ли до закрытия стрима удалять из памяти чанки, которые уже обработаны?
гуглить пробовал. проверять дампы памяти в chrome inspect-е тоже - там только ссылки на какие-то внутренние объекты движка.
*/
const https = require('https');
const source = 'https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nyc_pluto_19v2_csv.zip';
const consoleMemory = () => {
const m = process.memoryUsage();
for (const key of Reflect.ownKeys(m)) {
m[key] = ~~(m[key] / 1024 / 1024);
}
console.log(m);
}
const getDataStream = () => {
return new Promise((resolve) => {
https.get(source, resolve);
});
}
const main = () => new Promise(async (resolve) => {
const dataStream = await getDataStream();
let c = 0;
dataStream.on('data', (data) => {
c++;
if (c % 1000) return;
consoleMemory();
});
dataStream.on('end', resolve);
});
(async () => {
consoleMemory();
await main();
await new Promise(res => setTimeout(res, 5000));
consoleMemory();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment