-
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
- 파일을 감시하는 방법(변경 사항 발생 시 이벤트 호출)
'Node.js' 카테고리의 다른 글
2-16. 노드 에러 처리하기(예외 처리하기) (0) 2023.04.12 2-15. 노드 스레드풀과 커스텀 이벤트 (0) 2023.04.12 2-13. 노드 버퍼와 스트림의 모든 것 (0) 2023.04.12 2-12. 노드 파일 시스템 사용하기 (0) 2023.04.12 2-11. 노드 child_process (0) 2023.04.12