ν‹°μŠ€ν† λ¦¬ λ·°

Node.js

버퍼와 슀트림

yeahajeong 2021. 4. 22. 09:26
λ°˜μ‘ν˜•

νŒŒμΌμ„ μ½κ±°λ‚˜ μ“°λŠ” λ°©μ‹μ—λŠ” 크게 두가지가 μžˆλ‹€. ν•˜λ‚˜λŠ” 버퍼λ₯Ό μ΄μš©ν•˜λŠ” 방식이고, λ‹€λ₯Έ ν•˜λ‚˜λŠ” μŠ€νŠΈλ¦Όμ„ μ΄μš©ν•˜λŠ” 방식이닀. 버퍼링과 μŠ€νŠΈλ¦¬λ°μ΄λΌλŠ” 단어λ₯Ό μΌμƒμƒν™œμ—μ„œ 많이 듀어봀을 것이닀. 보톡 μ˜μƒμ„ μ‹œμ²­ν•  λ•Œ 많이 λ³Ό 수 μžˆλŠ” μš©μ–΄λ“€μ΄λ‹€. μ˜μƒμ„ λ‘œλ”©ν•  λ•Œ 버퍼링을 ν•œλ‹€κ³  ν•˜κ³ , μ˜μƒμ„ μ‹€μ‹œκ°„μœΌλ‘œ μ†‘μΆœν•  λ•ŒλŠ” μŠ€νŠΈλ¦¬λ°ν•œλ‹€κ³  ν•œλ‹€.

버퍼링은 μ˜μƒμ„ μž¬μƒν•  수 μžˆμ„ λ•ŒκΉŒμ§€ 데이터λ₯Ό λͺ¨μœΌλŠ” λ™μž‘μ΄κ³ , μŠ€νŠΈλ¦¬λ°μ€ λ°©μ†‘μΈμ˜ μ»΄ν“¨ν„°μ—μ„œ μ‹œμ²­μžμ˜ μ»΄ν“¨ν„°λ‘œ μ˜μƒ 데이터λ₯Ό μ‘°κΈˆμ”© μ „μ†‘ν•˜λŠ” 것이닀. μŠ€νŠΈλ¦¬λ°μ„ ν•˜λŠ” κ³Όμ •μ—μ„œ 버퍼링을 ν•  μˆ˜λ„ μžˆλ‹€. 전솑이 λ„ˆλ¬΄ 느리면 화면을 λ‚΄λ³΄λ‚΄κΈ°κΉŒμ§€ μ΅œμ†Œν•œμ˜ 데이터λ₯Ό λͺ¨μ•„μ•Ό ν•˜κ³ , μ˜μƒ 데이터가 μž¬μƒ 속도보닀 λΉ λ₯΄κ²Œ μ „μ†‘λ˜μ–΄λ„ 미리 전솑받은 데이터λ₯Ό μ €μž₯ν•  곡간이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λ…Έλ“œμ˜ 버퍼와 μŠ€νŠΈλ¦Όλ„ λΉ„μŠ·ν•œ κ°œλ…μ΄λ‹€. νŒŒμΌμ„ 읽으면 λ²„νΌν˜•μ‹μœΌλ‘œ 좜λ ₯ν•œλ‹€. λ…Έλ“œλŠ” νŒŒμΌμ„ 읽을 λ•Œ λ©”λͺ¨λ¦¬μ— 파일 크기만큼 곡간을 λ§ˆλ ¨ν•΄λ‘λ©° 파일 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œ λ’€ μ‚¬μš©μžκ°€ μ‘°μž‘ν•  수 μžˆλ„λ‘ν•˜λŠ”λ° μ΄λ•Œ λ©”λͺ¨λ¦¬μ— μ €μž₯된 데이터가 λ°”λ‘œ 버퍼닀.

  • λ²„νΌλž€? μš©λŸ‰μ΄ 큰 데이터λ₯Ό 전솑할 λ•Œ ν•œ λ²ˆμ— 전솑을 ν•˜μ§€ λͺ»ν•˜λ‹ˆκΉŒ νŠΉμ • λ‹¨μœ„ 만큼 λ¬Άμ–΄μ„œ 전솑을 ν•œλ‹€. κ·Έλ•Œ BUFFER의 크기만큼 BUFFER에 λ‹΄μ•„μ„œ μ „μ†‘ν•œλ‹€. 전솑 속도 차이에 λŒ€ν•œ μ„±λŠ₯을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©, μž…λ ₯ 속도에 λΉ„ν•΄ 좜λ ₯속도가 느린경우 데이터λ₯Ό μž„μ‹œ μ €μž₯ν•˜λŠ” 곡간.
  • μŠ€νŠΈλ¦Όμ΄λž€? λ‹€ μ°¬ 버퍼λ₯Ό μ „μ†‘ν•˜λŠ” 것이닀. 데이터듀이 움직일 수 μžˆλ„λ‘ 쀑간 닀리 μ—­ν• .

 

예λ₯Ό λ“€μ–΄ μ‚¬μš©μžλŠ” 1μ΄ˆμ— 100개의 데이터, ν”„λ‘œκ·Έλž¨μ€ 1μ΄ˆμ— 5개의 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  가정을 ν•΄λ³΄μž. ν”„λ‘œκ·Έλž¨ 처리λ₯Ό μ§„ν–‰ν•˜λŠ” λ™μ•ˆ μž…λ ₯μž₯치λ₯Ό 톡해 λ“€μ–΄μ˜€λŠ” λ°μ΄ν„°λŠ” λŒ€κΈ°λ₯Ό ν•΄μ•Όν•˜λŠ” 상황이 λœλ‹€. μ΄λŸ¬ν•œ 상황을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μž…λ ₯받은 데이터λ₯Ό λ²„νΌλΌλŠ” μž„μ‹œκ³΅κ°„μ— μ €μž₯해두고 ν”„λ‘œκ·Έλž¨μ—μ„œ μ²˜λ¦¬ν•  수 μžˆλŠ” μƒν™©μ΄λ˜κ±°λ‚˜ 버퍼가 κ½‰μ°¨κ²Œ 되면 버퍼에 μ €μž₯된 데이터λ₯Ό ν•œ λ²ˆμ— 전솑을 ν•œλ‹€.

μ΄λŸ°μ‹μœΌλ‘œ 버퍼λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 API 호좜횟수λ₯Ό 쀄여 μž…μΆœλ ₯ μ„±λŠ₯을 κ°œμ„ ν•˜κ²Œ λœλ‹€. μ΄λ ‡κ²Œ 보면 슀트림과 λ²„νΌλŠ” 항상 같이 λ¬Άμ—¬ λ‹€λ‹ˆλŠ”κ²ƒμ΄ 쒋을 κ²ƒκ°™μ§€λ§Œ λΉ λ₯Έ λ°˜μ‘μ΄ μš”κ΅¬λ˜λŠ” κ²Œμž„κ³Ό 같은 ν”„λ‘œκ·Έλž¨ 같은 κ²½μš°λŠ” μž…λ ₯이 μ΄λ€„μ§€λŠ” μ¦‰μ‹œ 전솑이 이루어져 λΉ λ₯Έ λ°˜μ‘ 속도λ₯Ό λ³΄μ—¬μ€˜μ•Όν•˜κΈ° λ•Œλ¬Έμ— 버퍼λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 쒋지 μ•Šλ‹€.

 

좜처 자료
tcpschool.com/cpp/cpp_io_streamBuffer

 


파일 읽고 쓰기에 κ΄€λ ¨λœ 문제

νŒŒμΌμ„ 읽어 1MB λ‹¨μœ„λ‘œ λΆ„ν• ν•˜μ—¬ μ €μž₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

const fs = require("fs");
//let data = [];

const LIMIT = 1024*1024;
let read_size = 0;
let count = 1;

let write_stream = fs.createWriteStream('test.txt.' + count);

//데이터λ₯Ό 읽어듀일 수 μžˆλŠ” 슀트림 생성
const read_stream = fs.createReadStream('./test2.jpg'); 

read_stream.on('data', function(chunk) {
	read_size += chunk.length;
	
	if (read_size >= LIMIT * count) {
		const now_data = chunk.slice(0, LIMIT - (read_size - chunk.length));
		const next_data = chunk.slice(LIMIT - (read_size - chunk.length));
		write_stream.write(now_data);
		write_stream.end();
		count++;
		write_stream = fs.createWriteStream('test.txt.' + count); 
		write_stream.write(next_data);
		
	} else {
		write_stream.write(chunk);
	}
});

read_stream.on('open', function(chunk) {
	console.log('open');
});

read_stream.on('close', function() {
	write_stream.end();
	console.log('close file');
});

read_stream.on('error', function(err) {
	console.log('error', err);
});

 

λΆ„ν• λœ νŒŒμΌμ„ μ—°μ†μœΌλ‘œ μ΄μ–΄λΆ™μ΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„± (파일 λ¦¬μŠ€νŠΈλŠ” μ•Œκ³  μžˆλ‹€κ³  κ°€μ •ν•œλ‹€.)

const fs = require("fs");

const files = ['test.txt.1', 'test.txt.2'];

let write_stream = fs.createWriteStream('test222.jpg');

function readAndWrite(idx) {
	if (idx >= files.length) {
		write_stream.end();
		console.log("end");
		return;
	}
	
	const file_path = files[idx];
	//데이터λ₯Ό 읽어듀일 수 μžˆλŠ” 슀트림 생성
	const read_stream = fs.createReadStream(file_path); 

	read_stream.on('data', function(chunk) {
		write_stream.write(chunk);
	});

	read_stream.on('open', function(chunk) {
		console.log('open');
	});

	read_stream.on('close', function() {
		console.log('close file');
		readAndWrite(idx + 1);
	});

	read_stream.on('error', function(err) {
		console.log('error', err);
	});
	
}

readAndWrite(0);

 

λ°˜μ‘ν˜•

'Node.js' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Node.js] IntelliJ에 Node.js ν™˜κ²½ μ„€μ •ν•˜κΈ°  (0) 2021.04.08
λŒ“κΈ€