Created
January 30, 2020 11:46
-
-
Save alex-samborskiy/b6e4c76b0f54898fbfdcc1bdbab14b87 to your computer and use it in GitHub Desktop.
[task qith memody usage] #task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| всем привет. просьба к опытным разрабам: помогите решить проблему плс. | |
| задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла. | |
| проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только 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