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!! 출력
});