Node.js

12. 스트림(Stream)

HJ76 2023. 4. 19. 18:43
스트림(Stream)

- 스트림(Stream)은 데이터를 읽거나 쓰는 것과 관련된 추상화된 인터페이스를 제공하는 기능

- 데이터를 여러 조각으로 나누어 처리할 수 있게 해줌

- 대용량 파일 등을 효율적으로 처리함

 

 

test.txt를 읽어들인 후 test2.txt로 data를 복사하는 동안 사용된 메모리의 크기 구하기

- test.txt : Lorem 100번 사용

const fs = require("fs");

// 현재 메모리 사용량
const beforeMem = process.memoryUsage().rss;
console.log(beforeMem); // 29745152

fs.readFile('./file.txt', (_,data)=>{
    fs.writeFile("./file2.txt", data, () =>{});
    const afterMem = process.memoryUsage().rss;
    const diff = afterMem - beforeMem;
    const consumed = diff / 1024 / 1024; // 메가바이트 형식으로 바꿈
    console.log(diff); // 733184
    console.log(`Consumed Memory: ${consumed}MB`); // 0.69921875MB
});

 

createReadStream()

- 파일을 읽어들이기 위한 스트림을 생성하는 메소드

- 대용량 파일을 읽을 때 사용됨

- 파일을 작은 조각으로 나누어 처리할 수 있음

 

fs.createReadStream(경로[, 옵션]);

 

const fs = require("fs");

const readStream = fs.createReadStream("./file.txt",{
    // 기본 데이터 64kbytes
    // highWaterMark 
    // 내부 버퍼 크기를 결정하는 옵션
    // highWaterMark: 8, 
    // encoding
    // 인코딩 방식을 결정하는 옵션
    encoding: "utf-8"
});
const beforeMem = process.memoryUsage().rss;
const data = [];
readStream.on("data", (chuck) => {
    console.log(chuck);
    console.count('data'); // data: 1
    readStream.close();
});

readStream.on("close", () =>{
    const afterMem = process.memoryUsage().rss;
    const diff = afterMem - beforeMem;
    const consumed = diff / 1024 / 1024;
    console.log(diff); // 614400
    console.log(`Consumed Memory: ${consumed}MB`); // Consumed Memory: 0.5859375MB
});

 

pipe()

- 스트림 간 데이터를 전송할 때 사용하는 메서드

 

readableStream객체.pipe(writableStream객체);

 

const fs = require("fs");
// zlib 모듈 : 파일 압축 및 압축 해제를 쉽게 수행할 수 있음
const zlib = require("zlib");

const readStream = fs.createReadStream("./file.txt");
const zlibStream = zlib.createGzip();
const writeStream = fs.createWriteStream("./file3.txt");

// 
const piping = readStream.pipe(zlibStream).pipe(writeStream);

// 전달되는 데이터의 상태를 감지하고 처리하기 위해 on() 메소드를 사용
piping.on("finish", () => {
    console.log("Done!!"); // 성공적으로 끝나면 Done!! 출력
});