-
Node Stream (대용량 파일 읽기)Programming/NodeJs 2022. 3. 3. 23:39
우연찮게 개발 직군 테크 인터뷰 도중 받은 질문에 대해 궁금증이 생겨서 찾아보게 되었다.
그동안 용량이 고만고만한 작은 파일들은 읽고 쓰기를 많이 해보았지만 아주 대용량인 파일을 어떻게 처리하겠느냐에 대한 질문을 막상 받자 드는 생각은 파일을 쪼개야하지 않을까 였는데, 구글링 해보니 5분만에 어찌해야하는지 알 수 있었기 때문에 블로그에도 정리를 해본다.
우선 기존의 Nodejs를 활용한 파일 읽어오기 방식은 파일 시스템을 이용하여
const fs = require('fs'); fs.readFile('example'(data,err) => {});
대략 이런식으로 파일 자체를 읽어 오는 방식이였다면,
새로이 알게된 것은 바로 Stream 함수이다. 이를 활용한다면 바로
const fs = require('fs'); const stream = fs.createReadStream('./example.file'); stream.on('data',()=>{}); stream.on('end,()=>{}); stream.on('error',()=>{});
이렇게 3가지 이벤트 정도로 나눠지는데, data는 파일 내용의 일부를 반환하고, end는 File Read 완료시 호출된다. error는 이름 그대로이다.
해서 이러한 스트림 함수를 사용하면 파일을 통째로 메모리에 적재하여 읽을 필요없이 일부분씩 읽고 쓰기를 처리 할 수 있다는 의미이다.
이러한 스트림은 pipe라는 함수와 함께 사용 할 수 있는데, pipe 함수의 매개변수로 fs.createWriteStream으로 읽어온 파일을 넣어주면 된다. 그렇게 된다면 스트림 간의 일고 쓰기 이벤트를 연결하여주기 때문에 이러한 일련의 과정들이 여러 줄의 코드가 아닌 한줄의 코드에서 구현 될 수 있으며, 이러한 파이프 함수 또한 여러개를 이어서 호출 할 수 있기 때문에 코드의 효율성과 명시성을 끌어 올릴 수 있다.
'Programming > NodeJs' 카테고리의 다른 글
(mac)NVM 설치 및 Node 버전 관리하기. (0) 2023.02.19 Node.js와 이벤트루프 (0) 2022.04.04 Node Stream Read,Writable (대용량 파일 읽기-2-) (0) 2022.03.13 (mac)node 버전 관리하기. (0) 2022.02.11 Winston.js를 이용한 Logging System 구축 (0) 2022.02.10