본문 바로가기

Programming/Node.js

4. Node 기능 살펴보기 (7) - 버퍼와 스트림 6

node js logo image

 

 

 

 

지금까지 크게 버퍼를 사용하는 방식과 스트림을 사용하는 방식을 살펴보았습니다. 이제, 이 두 방식을 통해 동일한 작업을 처리할 경우 어떤 차이가 있는지를 살펴보겠습니다. readFile과 createReadStream 메서드를 이용해서 1GB 수준의 크기의 파일을 만들때 시간 차이가 얼마나 발생할지 확인해보죠.

 

우선 createWriteStream( )을 이용해서 대용량 파일을 생성해 보겠습니다. 생각보다 시간이 꽤 걸립니다.

 

const fs = require('fs');
const file = fs.createWriteStream('./big.txt');

for (let i = 0; i <= 10000000; i++) {
    file.write('I am gonna make a huge file!');
}

file.end();

 

일단, 이렇게 만들어진 [big.txt]는 무려 270MB 수준입니다.  

 

 


 

 

 

○ 버퍼로 복사하기(readFile)

 

우선 readFile 메서드를 사용해 [big.txt]를 [big2.txt]로 복사해 보겠습니다. 

 

const fs = require('fs');

// 사용 중인 메모리 용량 표시(실행 전)
console.log('before: ', process.memoryUsage().rss);

const data1 = fs.readFileSync('./big.txt');
fs.writeFileSync('./big2.txt', data1);
console.log('buffer: ', process.memoryUsage().rss);

/* 출력
before:  25759744
buffer:  306851840
*/

 

 

25MB 수준이었던 메모리 용량이 306MB까지 증가하였습니다. 

 

 

 

 

○ 스트림으로 복사하기(readStream, writeStream)

 

이번에는 스트림을 이용해서 [big.txt]를 [big3.txt]로 복사하겠습니다. 

 

 

const fs = require('fs');

// 사용 중인 메모리 용량 표시(실행 전)
console.log('before: ', process.memoryUsage().rss);

const readStream = fs.createReadStream('./big.txt');
const writeStream = fs.createWriteStream('./big3.txt');

readStream.pipe(writeStream);
readStream.on('end', () => {
    console.log('stream: ', process.memoryUsage().rss);
});

/* 출력
before:  25804800
stream:  37617664
*/

 

 

25MB의 메모리가 37MB까지만 증가했습니다. 크게 개선된 것을 확인할 수 있습니다.