ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2-14. 노드 pipe와 스트림 메모리 효율 확인하기
    Node.js 2023. 4. 12. 16:24

    I. pipe 방식

     

    const fs = require('fs');
    const zlib = require('zlib');
    
    const readStream = fs.createReadStream('readme4.txt', { highWaterMark: 16 });
    const zlibStream = zlib.createGzip();
    const writeStream = fs.createWriteStream('writeme3.txt');
    readStream.pipe(writeStream);

    위 코드를 해석하면,

    "readme4.txt 를 16바이트씩 읽어서 writeme3.txt 라는 파일을 만들고 거기에 16바이트씩 써라" 라는 뜻이다.

    한마디로 파일을 복사하라는 것이다.

    pipe 끼리 여러번 연결할 수도 있다.

     

    zlib.createGzip() : 압축해라

     

    pipe가 모든 것에 지원이 되는 것은 아니다!!

    - stream을 지원하는 애들끼리만 된다.

     

     

     

    II. 대용량 파일 생성할 때, 메모리 비교

    // createBigFile.js
    
    const fs = require('fs');
    const file = fs.createWriteStream('./big.txt');
    
    for (let i = 0; i <= 10000000; i++) {
      file.write('안녕하세요. 엄청나게 큰 파일을 만들어 볼 것입니다. 각오 단단히 하세요!\n');
    }
    file.end();

    위 코드를 실행하면 대략 1GB 정도의 파일을 생성하게 된다.

    따라서, 실행하기 전에 용량 1GB 정도의 여유공간은 충분히 두고 실행해야 한다.

    또한 원래 조금 오래걸릴 수도 있는 코드니, 오래걸린다고 해서 걱정안해도 된다.

     

     위 코드 메모리 체크

     

    버퍼 방식

    // buffer-memory.js
    
    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);

     

    스트림 방식

    // stream-memory.js
    
    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);
    });

     

    버퍼 방식과 스트림 방식의 메모리 용량을 비교하기 위한 코드이다.

    실행을 해봤을 때, 버퍼 방식은 스트림 방식에 비해 굉장히 많은 용량을 차지한다는 것을 볼 수 있다.

    따라서, 메모리 효율을 생각해보면 스트림 방식이 더 효율적이다.

     

     

     

    III. 기타 fs 메서드

     

    fs.access(경로, 옵션, 콜백)

    - 폴더나 파일에 접근할 수 있는지를 체크한다. 두 번째 인자로 상수들을 넣었다. 

    - F_OK는 파일 존재 여부, R_OK는 읽기 권한 여부, W_OK는 쓰기 권한 여부를 체크한다.

    - 파일/폴더나 권한이 없다면 에러가 방상하는데, 파일/폴더가 없을 때의 에러 코드는 ENOENT다. 

     

    fs.mkdir(경로, 콜백)

    - 폴더를 만드는 메서드

    - 이미 폴더가 있다면 에러가 발생해서 먼저 access() 메서드를 호출해서 확인하는 작업이 필요하다.

     

    fs.open(경로, 옵션, 콜백)

    파일의 아이디(fd 변수)를 가져오는 메서드

    파일이 없다면 파일을 생성한 뒤 그 아이디를 가져온다. 가져온 아이디를 사용해 fs.read() 나 fs.write()로 읽거나 쓸 수 있다. 

    두 번째 인자로 어떤 동작을 할 것인지 설정할 수 있다. 쓰려면 w, 읽으려면 r, 기존 파일에 추가하려면 a다. 

    위의 코드에서는 w로 설정해서 파일이 없을 때 새로 만들 수 있었다. r이었다면 에러가 발생한다. 

     

    fs.rename(기존 경로, 새 경로, 콜백)

    - 파일의 이름을 바꾸는 메서드

    - 기존 파일 위치와 새로운 파일 위치를 적어주면 된다.

    - 반드시 같은 폴더를 지정할 필요는 없다. 

     

    fs.watch

    - 파일을 감시하는 방법(변경 사항 발생 시 이벤트 호출)

     

Designed by Tistory.