삽질하는플머

nodejs 모듈 추천 : mmap-io

탐구생활/node.js

최근 사용해본 노드 모듈중 개인적으로 제일 감탄한 물건.
https://www.npmjs.com/package/mmap-io

 

 

간단히 말해 "메모리맵드 파일 IO"를 nodejs 에서 가능하게 하는 놈이다.

 

윈도와 리눅스에서 동작 확인했고 맥은 귀찮아서 안해봤다.
알맹이는 C로 되어있는데... posix의 mmap() 함수를 윈도에서 CreateFileMapping() 으로 완벽히 에뮬레이트 한다.
원래 두 함수의 개념이 비슷하니까 그럴 수도 있겠지만... 50줄도 안되는 구현체를 실제 알현하는 충격은 크다.

 

어디에 써먹냐고?
IPC, 또는 덩치가 큰 파일을 메모리에 올려야 하는 경우 유용하게 사용할 수 있다.

 

4바이트 부호없는 정수 정보가 3천만개 늘어선 배열을 떠올려보자.
4 * 3천만 = 120메가. 일단 파일로 저장해두었다.


이 배열의 특정 인덱스를 요청받을 때 응답하는 서버를 만든다고 하자.

 

 

데이터를 부르고

 

var data_buffer = fs.readFileSync(dataFile);  

 

4바이트 부호없는 정수 배열로 간주, 지정 인덱스의 정보를 리턴.

 

function readData( index ) { 
    return data_buffer.readUInt32LE( index * 4 ); 
} 

 

이 기능을 가지는 서버는 일단 120메가를 먹고 시작한다.

데이터 부르는 부분을 mmap-io를 써서 이렇게 바꿔보자.

 

const mmap = require('mmap-io');  
const fs = require('fs');  

var fd = fs.openSync(dataFile, 'r');  
var size = fs.fstatSync(fd).size;  

var data_buffer = mmap.map(size, mmap.PROT_READ, mmap.MAP_SHARED, fd);  

 

동작메모리를 살펴보면 상당히 줄어들어있을 것이다.

파일을 메모리에 올리지 않고 매핑한 상태이기 때문이다. 

이 상태에서도 수정 전 읽어서 올린방식과 동일하게 readData() 함수는 정상적으로 돌아간다.

 

seek/read 없이 파일의 어떤 위치건 마치 메모리 블럭처럼 랜덤억세스 할 수 있다는 얘기. 

 

결론은...
DB에 담기 애매한 크기의 정보를 제공해야하는 경우 아주 유용하다는 것.