Streams & Backpressure: GB Boyutlu Dosyaları RAM Taşmadan İşlemek
10 GB'lık log dosyasını 50 MB RAM kullanarak saniyeler içinde okuyup sıkıştırma sanatı.
Bahçe hortumundan gelen suyu tek bir dev kova yerine bardak bardak içmek veya aktarmaktır. Bardak dolunca musluğu hafifçe kısarsınız (Backpressure).
fs.readFile tüm dosyayı belleğe yükler (OOM riski). Stream ise veriyi 64KB'lık parçalar (chunks) halinde aktarır. Readable, Writable, Transform ve Duplex stream tipleri vardır. pipeline() metodu otomatik hata yakalama ve backpressure yönetimi sunar.
“Stream'ler büyük veri akışlarında RAM tüketimini sabit tutar. Backpressure, okuma hızı yazma hızından yüksek olduğunda aradaki tamponun (buffer) patlamasını önlemek için okumayı geçici olarak durduran mekanizmadır.”
import { pipeline } from 'node:stream/promises';
import fs from 'node:fs';
import zlib from 'node:zlib';
// 10GB dosyayı 50MB RAM ile gzip yapar:
await pipeline(
fs.createReadStream('huge.log'),
zlib.createGzip(),
fs.createWriteStream('huge.log.gz')
);
Büyük dosya transferlerinde res.send(fs.readFileSync(file)) kullanmak ve sunucunun RAM'ini tüketip Node sürecini çökertmek.