Temat zarządzania pamięcią w programowaniu pojawia się często dopiero wtedy, gdy zaczyna nam jej brakować. 😅 Strumieniowanie w Node.js, to jeden z tych konceptów, które mogą nam podreperować jej stan niskim kosztem.
Zobaczmy przykład funkcji readFileSync
, która - wszystkim dobrze znana - odczytuje zawartość pliku:
const file = fs.readFileSync("./csv/a1.csv", "utf8")const data = file.split(os.EOL)
Problem w tym, że gdy w tym przykładzie wywołujemy metodę split
, żeby rozbić plik csv na poszczególne wiersze, cały plik ładowany jest do naszej pamięci od razu. Niezależnie od tego, czy potrzebujemy dostać się do pierwszego czy do ostatniego wiersza w csv. Mało tego - przetwarzanie pliku rozpocznie się dopiero, gdy całość będzie zaalokowana w pamięci.
Zmiana kodu na stream powoduje, że dane są doładowywane stopniowo, a procesowanie uruchamia się natychmiastowo. Pamięć nie będzie obciążana danymi, których nie procesujemy. A jak to wygląda w kodzie? Deklaratywnie i elegancko. 😎
const file = path.resolve(__dirname, "./csv/a1.csv")const stream = fs.createReadStream(file).pipe(csv())stream.on("data", row => {console.log(row)stream.end()})
Warto rozważyć tę drobną zmianę i oszczędzić sobie często trudnych do znalezienia wycieków.