버퍼와 스트림

김무연·2023년 12월 12일

Backend

목록 보기
21/49

버퍼 : 일정한 크기로 모아두는 데이터

  • 일정한 크기가 되면 한 번에 처리 및 전송
  • 예를 들어 16바이트까지 데이터를 모아두었다가 16바이트가 되는 순간 처리
  • 버퍼의 형식은 010101과 같은 데이터를 16진법으로 표기한 것
  • 버퍼링 : 버퍼에 데이터가 찰 때까지 모으는 작업

스트림 : 데이터의 흐름

  • 일정한 크기로 나눠서 여러 번에 걸쳐서 처리
  • 버퍼(또는 청크) 의 크기를 작게 만들어서 주기적으로 데이터를 전달
  • 스트리밍 : 일정한 크기의 데이터를 지속적으로 전달하는 작업

예를 들어 100mb 짜리 데이터가 있다면 버퍼는 100mb 까지 모았다가 한 번에 보내는 것이고, 스트림은 1mb씩 계속 전달해주기 때문에 효율적으로 데이터를 보내줄 수 있음

버퍼 사용하기

노드에서는 Buffer 객체 사용

const buffer = Buffer.from('저를 바꿔보세요')
console.log(buffer);
console.log(buffer.length);
console.log(buffer.toString());

const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '), Buffer.from('띄엄 ')];
console.log(Buffer.concat(array).toString());

concat으로 각각의 buffer들을 합칠 수 있다

console.log(Buffer.alloc(5));

.alloc() 메소드는 데이터를 채울 필요가 없는 빈 버퍼를 생성하고 싶을 때 유용하다. 기본적으로, 숫자를 인수로 받으며 받은 숫자만큼의 빈 사이즈의 버퍼를 생성한다.

stream 사용하기

const fs = require('fs')

const readStream = fs.createReadStream('ch06/readme.txt');

const data = []

readStream.on('data', (chunk) => {
  data.push(chunk);
  console.log('data', chunk, chunk.length);

})

readStream.on('end', () => {
  console.log('end', Buffer.concat(data).toString());
})

readStream.on('error', (err) => {
  console.log('error', err);
})

data의 빈 배열에다가 stream방식으로 data를 쪼개서, 담아주고 나중에 concat으로 합치는 방식이다.

하지만 위의 결과를 보면 stream 방식인데도 불구하고, 데이터를 한 번에 다 받아온 것을 확인할 수 있다.

이는 readStream이 한 번에 받아오는 default 값 사이즈가 64kb 인데 위의 문장은 162byte 밖에 되지 않기 때문에 한 번에 다 받아오게 된 것이다.

이를 원하는 값 사이즈로 잘라 받아오기 위해서는 아래와 같다

const fs = require('fs')

const readStream = fs.createReadStream('ch06/readme.txt', { highWaterMark: 16 });

const data = []

readStream.on('data', (chunk) => {
  data.push(chunk);
  console.log('data', chunk, chunk.length);

})

readStream.on('end', () => {
  console.log('end', Buffer.concat(data).toString());
})

readStream.on('error', (err) => {
  console.log('error', err);
})

createReadStream 인수에 highWaterMark로 나누어 받을 값 사이즈를 입력해주면 된다

마찬가지로 writeStream 으로 글을 작성한다고 할 때 1GB 짜리 글을 써야 한다면 한 번에 쓸 경우 메모리 부하가 심해지기 때문에 나누어서 작성합니다.

const fs = require('fs');

const writeStream = fs.createWriteStream('/ch06/writeme.txt')

writeStream.on('finish', () => {
  console.log('파일 쓰기 완료')
})

writeStream.write('이 글을 씁니다 \n')
writeStream.write('메모리 부하를 막기 위해 한 번 더 이렇게 씁니다.')
writeStream.end();
profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글