ಕನ್ನಡ

ದೊಡ್ಡ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಸಮರ್ಥವಾಗಿ ಸಂಸ್ಕರಿಸುವ ಮೂಲಕ, ಸ್ಕೇಲೆಬಿಲಿಟಿ ಮತ್ತು ರೆಸ್ಪಾನ್ಸಿವ್‌ನೆಸ್ ಅನ್ನು ಹೆಚ್ಚಿಸುವ ಮೂಲಕ Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಹೇಗೆ ಸುಧಾರಿಸಬಹುದು ಎಂಬುದನ್ನು ತಿಳಿಯಿರಿ.

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು: ದೊಡ್ಡ ಡೇಟಾವನ್ನು ಸಮರ್ಥವಾಗಿ ನಿರ್ವಹಿಸುವುದು

ಡೇಟಾ-ಚಾಲಿತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಆಧುನಿಕ ಯುಗದಲ್ಲಿ, ದೊಡ್ಡ ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಸಮರ್ಥವಾಗಿ ನಿರ್ವಹಿಸುವುದು ಅತ್ಯಗತ್ಯ. Node.js, ತನ್ನ ನಾನ್-ಬ್ಲಾಕಿಂಗ್, ಈವೆಂಟ್-ಚಾಲಿತ ಆರ್ಕಿಟೆಕ್ಚರ್‌ನೊಂದಿಗೆ, ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಬಲ್ಲ ತುಣುಕುಗಳಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಪ್ರಬಲವಾದ ಯಾಂತ್ರಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ನೀಡುತ್ತದೆ: ಸ್ಟ್ರೀಮ್‌ಗಳು. ಈ ಲೇಖನವು Node.js ಸ್ಟ್ರೀಮ್‌ಗಳ ಜಗತ್ತನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ, ಸಂಪನ್ಮೂಲಗಳನ್ನು ಖಾಲಿ ಮಾಡದೆಯೇ ಬೃಹತ್ ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ನಿಭಾಯಿಸಬಲ್ಲ ಸ್ಕೇಲೆಬಲ್ ಮತ್ತು ಸ್ಪಂದಿಸುವ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅವುಗಳ ಪ್ರಯೋಜನಗಳು, ಪ್ರಕಾರಗಳು ಮತ್ತು ಪ್ರಾಯೋಗಿಕ ಅನ್ವಯಗಳನ್ನು ಅನ್ವೇಷಿಸುತ್ತದೆ.

ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಏಕೆ ಬಳಸಬೇಕು?

ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ, ಇಡೀ ಫೈಲ್ ಅನ್ನು ಓದುವುದು ಅಥವಾ ನೆಟ್‌ವರ್ಕ್ ವಿನಂತಿಯಿಂದ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸುವ ಮೊದಲು ಅದನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವುದರಿಂದ ಗಮನಾರ್ಹ ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಡಚಣೆಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು, ವಿಶೇಷವಾಗಿ ದೊಡ್ಡ ಫೈಲ್‌ಗಳು ಅಥವಾ ನಿರಂತರ ಡೇಟಾ ಫೀಡ್‌ಗಳೊಂದಿಗೆ ವ್ಯವಹರಿಸುವಾಗ. ಬಫರಿಂಗ್ ಎಂದು ಕರೆಯಲ್ಪಡುವ ಈ ವಿಧಾನವು ಗಣನೀಯ ಮೆಮೊರಿಯನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ನ ಒಟ್ಟಾರೆ ಸ್ಪಂದಿಸುವಿಕೆಯನ್ನು ನಿಧಾನಗೊಳಿಸಬಹುದು. ಸ್ಟ್ರೀಮ್‌ಗಳು ಡೇಟಾವನ್ನು ಸಣ್ಣ, ಸ್ವತಂತ್ರ ತುಣುಕುಗಳಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಮೂಲಕ ಹೆಚ್ಚು ಪರಿಣಾಮಕಾರಿ ಪರ್ಯಾಯವನ್ನು ಒದಗಿಸುತ್ತವೆ, ಇದು ಇಡೀ ಡೇಟಾಸೆಟ್ ಲೋಡ್ ಆಗುವವರೆಗೆ ಕಾಯದೆ ಡೇಟಾ ಲಭ್ಯವಾದ ತಕ್ಷಣ ಅದರೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ವಿಧಾನವು ವಿಶೇಷವಾಗಿ ಈ ಕೆಳಗಿನವುಗಳಿಗೆ ಪ್ರಯೋಜನಕಾರಿಯಾಗಿದೆ:

ಸ್ಟ್ರೀಮ್ ಪ್ರಕಾರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು

Node.js ನಾಲ್ಕು ಮೂಲಭೂತ ರೀತಿಯ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ, ಪ್ರತಿಯೊಂದೂ ನಿರ್ದಿಷ್ಟ ಉದ್ದೇಶಕ್ಕಾಗಿ ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ:

  1. ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳು: ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಫೈಲ್, ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ, ಅಥವಾ ಡೇಟಾ ಜನರೇಟರ್‌ನಂತಹ ಮೂಲದಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ಬಳಸಲಾಗುತ್ತದೆ. ಹೊಸ ಡೇಟಾ ಲಭ್ಯವಾದಾಗ ಅವು 'data' ಈವೆಂಟ್‌ಗಳನ್ನು ಮತ್ತು ಡೇಟಾ ಮೂಲವು ಸಂಪೂರ್ಣವಾಗಿ ಬಳಕೆಯಾದಾಗ 'end' ಈವೆಂಟ್‌ಗಳನ್ನು ಹೊರಸೂಸುತ್ತವೆ.
  2. ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳು: ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಫೈಲ್, ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕ, ಅಥವಾ ಡೇಟಾಬೇಸ್‌ನಂತಹ ಗಮ್ಯಸ್ಥಾನಕ್ಕೆ ಡೇಟಾವನ್ನು ಬರೆಯಲು ಬಳಸಲಾಗುತ್ತದೆ. ಅವು ಡೇಟಾವನ್ನು ಬರೆಯಲು ಮತ್ತು ದೋಷಗಳನ್ನು ನಿರ್ವಹಿಸಲು ವಿಧಾನಗಳನ್ನು ಒದಗಿಸುತ್ತವೆ.
  3. ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಸ್ಟ್ರೀಮ್‌ಗಳು: ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಸ್ಟ್ರೀಮ್‌ಗಳು ರೀಡಬಲ್ ಮತ್ತು ರೈಟಬಲ್ ಎರಡೂ ಆಗಿರುತ್ತವೆ, ಡೇಟಾವು ಏಕಕಾಲದಲ್ಲಿ ಎರಡೂ ದಿಕ್ಕುಗಳಲ್ಲಿ ಹರಿಯಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಇವುಗಳನ್ನು ಸಾಕೆಟ್‌ಗಳಂತಹ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕಗಳಿಗಾಗಿ ಸಾಮಾನ್ಯವಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.
  4. ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ಗಳು: ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ಗಳು ಒಂದು ವಿಶೇಷ ರೀತಿಯ ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಸ್ಟ್ರೀಮ್ ಆಗಿದ್ದು, ಡೇಟಾವು ಹಾದುಹೋಗುವಾಗ ಅದನ್ನು ಮಾರ್ಪಡಿಸಬಹುದು ಅಥವಾ ರೂಪಾಂತರಿಸಬಹುದು. ಕಂಪ್ರೆಷನ್, ಎನ್‌ಕ್ರಿಪ್ಶನ್, ಅಥವಾ ಡೇಟಾ ಪರಿವರ್ತನೆಯಂತಹ ಕಾರ್ಯಗಳಿಗೆ ಇವು ಸೂಕ್ತವಾಗಿವೆ.

ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವುದು

ವಿವಿಧ ಮೂಲಗಳಿಂದ ಡೇಟಾವನ್ನು ಓದಲು ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳು ಅಡಿಪಾಯವಾಗಿವೆ. ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್ ಬಳಸಿ ದೊಡ್ಡ ಟೆಕ್ಸ್ಟ್ ಫೈಲ್ ಅನ್ನು ಓದುವ ಮೂಲ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:

const fs = require('fs');

const readableStream = fs.createReadStream('large-file.txt', { encoding: 'utf8', highWaterMark: 16384 });

readableStream.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data`);
  // ಡೇಟಾ ಚಂಕ್ ಅನ್ನು ಇಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಿ
});

readableStream.on('end', () => {
  console.log('Finished reading the file');
});

readableStream.on('error', (err) => {
  console.error('An error occurred:', err);
});

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ:

ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವುದು

ವಿವಿಧ ಗಮ್ಯಸ್ಥಾನಗಳಿಗೆ ಡೇಟಾವನ್ನು ಬರೆಯಲು ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್ ಬಳಸಿ ಫೈಲ್‌ಗೆ ಡೇಟಾವನ್ನು ಬರೆಯುವ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:

const fs = require('fs');

const writableStream = fs.createWriteStream('output.txt', { encoding: 'utf8' });

writableStream.write('This is the first line of data.\n');
writableStream.write('This is the second line of data.\n');
writableStream.write('This is the third line of data.\n');

writableStream.end(() => {
  console.log('Finished writing to the file');
});

writableStream.on('error', (err) => {
  console.error('An error occurred:', err);
});

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ:

ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಪೈಪ್ ಮಾಡುವುದು

ಪೈಪಿಂಗ್ ಎನ್ನುವುದು ರೀಡಬಲ್ ಮತ್ತು ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಸಂಪರ್ಕಿಸಲು ಒಂದು ಪ್ರಬಲ ಯಾಂತ್ರಿಕ ವ್ಯವಸ್ಥೆಯಾಗಿದ್ದು, ಒಂದು ಸ್ಟ್ರೀಮ್‌ನಿಂದ ಇನ್ನೊಂದಕ್ಕೆ ಡೇಟಾವನ್ನು ಮನಬಂದಂತೆ ವರ್ಗಾಯಿಸಲು ನಿಮಗೆ ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. pipe() ವಿಧಾನವು ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಸಂಪರ್ಕಿಸುವ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸರಳಗೊಳಿಸುತ್ತದೆ, ಡೇಟಾ ಹರಿವು ಮತ್ತು ದೋಷ ಪ್ರಸರಣವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸುತ್ತದೆ. ಸ್ಟ್ರೀಮಿಂಗ್ ರೀತಿಯಲ್ಲಿ ಡೇಟಾವನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಇದು ಅತ್ಯಂತ ಪರಿಣಾಮಕಾರಿ ಮಾರ್ಗವಾಗಿದೆ.

const fs = require('fs');
const zlib = require('zlib'); // For gzip compression

const readableStream = fs.createReadStream('large-file.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('large-file.txt.gz');

readableStream.pipe(gzipStream).pipe(writableStream);

writableStream.on('finish', () => {
  console.log('File compressed successfully!');
});

ಈ ಉದಾಹರಣೆಯು ಪೈಪಿಂಗ್ ಬಳಸಿ ದೊಡ್ಡ ಫೈಲ್ ಅನ್ನು ಹೇಗೆ ಕಂಪ್ರೆಸ್ ಮಾಡುವುದು ಎಂಬುದನ್ನು ತೋರಿಸುತ್ತದೆ:

ಪೈಪಿಂಗ್ ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಭಾಯಿಸುತ್ತದೆ. ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್ ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಿಂತ ವೇಗವಾಗಿ ಡೇಟಾವನ್ನು ಉತ್ಪಾದಿಸಿದಾಗ ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಸಂಭವಿಸುತ್ತದೆ. ಪೈಪಿಂಗ್ ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್ ಹೆಚ್ಚು ಸ್ವೀಕರಿಸಲು ಸಿದ್ಧವಾಗುವವರೆಗೆ ಡೇಟಾ ಹರಿವನ್ನು ವಿರಾಮಗೊಳಿಸುವ ಮೂಲಕ ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್ ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಮುಳುಗಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ಇದು ಸಮರ್ಥ ಸಂಪನ್ಮೂಲ ಬಳಕೆಯನ್ನು ಖಾತ್ರಿಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಮೆಮೊರಿ ಓವರ್‌ಫ್ಲೋವನ್ನು ತಡೆಯುತ್ತದೆ.

ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ಗಳು: ಹಾರಾಡುತ್ತಾ ಡೇಟಾವನ್ನು ಮಾರ್ಪಡಿಸುವುದು

ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ಗಳು ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್‌ನಿಂದ ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗೆ ಡೇಟಾ ಹರಿಯುವಾಗ ಅದನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಥವಾ ರೂಪಾಂತರಿಸಲು ಒಂದು ಮಾರ್ಗವನ್ನು ಒದಗಿಸುತ್ತವೆ. ಡೇಟಾ ಪರಿವರ್ತನೆ, ಫಿಲ್ಟರಿಂಗ್, ಅಥವಾ ಎನ್‌ಕ್ರಿಪ್ಶನ್‌ನಂತಹ ಕಾರ್ಯಗಳಿಗೆ ಇವು ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿವೆ. ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ಗಳು ಡ್ಯೂಪ್ಲೆಕ್ಸ್ ಸ್ಟ್ರೀಮ್‌ಗಳಿಂದ ಆನುವಂಶಿಕವಾಗಿ ಬರುತ್ತವೆ ಮತ್ತು ಡೇಟಾ ರೂಪಾಂತರವನ್ನು ನಿರ್ವಹಿಸುವ _transform() ವಿಧಾನವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತವೆ.

ಪಠ್ಯವನ್ನು ದೊಡ್ಡಕ್ಷರಕ್ಕೆ ಪರಿವರ್ತಿಸುವ ಟ್ರಾನ್ಸ್‌ಫಾರ್ಮ್ ಸ್ಟ್ರೀಮ್‌ನ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:

const { Transform } = require('stream');

class UppercaseTransform extends Transform {
  constructor() {
    super();
  }

  _transform(chunk, encoding, callback) {
    const transformedChunk = chunk.toString().toUpperCase();
    callback(null, transformedChunk);
  }
}

const uppercaseTransform = new UppercaseTransform();

const readableStream = process.stdin; // Read from standard input
const writableStream = process.stdout; // Write to standard output

readableStream.pipe(uppercaseTransform).pipe(writableStream);

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ:

ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ನಿರ್ವಹಿಸುವುದು

ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಸ್ಟ್ರೀಮ್ ಪ್ರೊಸೆಸಿಂಗ್‌ನಲ್ಲಿ ಒಂದು ನಿರ್ಣಾಯಕ ಪರಿಕಲ್ಪನೆಯಾಗಿದ್ದು, ಇದು ಒಂದು ಸ್ಟ್ರೀಮ್ ಇನ್ನೊಂದನ್ನು ಮುಳುಗಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ. ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್ ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್‌ಗಿಂತ ವೇಗವಾಗಿ ಡೇಟಾವನ್ನು ಉತ್ಪಾದಿಸಿದಾಗ, ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಸಂಭವಿಸುತ್ತದೆ. ಸರಿಯಾದ ನಿರ್ವಹಣೆಯಿಲ್ಲದೆ, ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಮೆಮೊರಿ ಓವರ್‌ಫ್ಲೋ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಅಸ್ಥಿರತೆಗೆ ಕಾರಣವಾಗಬಹುದು. Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು ಯಾಂತ್ರಿಕ ವ್ಯವಸ್ಥೆಗಳನ್ನು ಒದಗಿಸುತ್ತವೆ.

pipe() ವಿಧಾನವು ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿಭಾಯಿಸುತ್ತದೆ. ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್ ಹೆಚ್ಚು ಡೇಟಾವನ್ನು ಸ್ವೀಕರಿಸಲು ಸಿದ್ಧವಿಲ್ಲದಿದ್ದಾಗ, ರೈಟಬಲ್ ಸ್ಟ್ರೀಮ್ ಸಿದ್ಧವಾಗಿದೆ ಎಂದು ಸಂಕೇತಿಸುವವರೆಗೆ ರೀಡಬಲ್ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಪ್ರೋಗ್ರಾಮ್ಯಾಟಿಕ್ ಆಗಿ ಸ್ಟ್ರೀಮ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ (pipe() ಬಳಸದೆ), ನೀವು readable.pause() ಮತ್ತು readable.resume() ವಿಧಾನಗಳನ್ನು ಬಳಸಿ ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಿರ್ವಹಿಸಬೇಕಾಗುತ್ತದೆ.

ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಹೇಗೆ ನಿರ್ವಹಿಸುವುದು ಎಂಬುದಕ್ಕೆ ಒಂದು ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ:

const fs = require('fs');

const readableStream = fs.createReadStream('large-file.txt');
const writableStream = fs.createWriteStream('output.txt');

readableStream.on('data', (chunk) => {
  if (!writableStream.write(chunk)) {
    readableStream.pause();
  }
});

writableStream.on('drain', () => {
  readableStream.resume();
});

readableStream.on('end', () => {
  writableStream.end();
});

ಈ ಉದಾಹರಣೆಯಲ್ಲಿ:

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳ ಪ್ರಾಯೋಗಿಕ ಅನ್ವಯಗಳು

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು ದೊಡ್ಡ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸುವುದು ನಿರ್ಣಾಯಕವಾಗಿರುವ ವಿವಿಧ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ ಅನ್ವಯಗಳನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತವೆ. ಇಲ್ಲಿ ಕೆಲವು ಉದಾಹರಣೆಗಳಿವೆ:

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಬಳಸಲು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಬಳಸಿಕೊಳ್ಳಲು ಮತ್ತು ಅವುಗಳ ಪ್ರಯೋಜನಗಳನ್ನು ಗರಿಷ್ಠಗೊಳಿಸಲು, ಈ ಕೆಳಗಿನ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಪರಿಗಣಿಸಿ:

ತೀರ್ಮಾನ

Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು ದೊಡ್ಡ ಡೇಟಾವನ್ನು ಸಮರ್ಥವಾಗಿ ನಿರ್ವಹಿಸಲು ಪ್ರಬಲ ಸಾಧನವಾಗಿದೆ. ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಬಲ್ಲ ತುಣುಕುಗಳಲ್ಲಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಮೂಲಕ, ಸ್ಟ್ರೀಮ್‌ಗಳು ಮೆಮೊರಿ ಬಳಕೆಯನ್ನು ಗಣನೀಯವಾಗಿ ಕಡಿಮೆ ಮಾಡುತ್ತದೆ, ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ ಮತ್ತು ಸ್ಕೇಲೆಬಿಲಿಟಿಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ. ವಿವಿಧ ಸ್ಟ್ರೀಮ್ ಪ್ರಕಾರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು, ಪೈಪಿಂಗ್ ಅನ್ನು ಕರಗತ ಮಾಡಿಕೊಳ್ಳುವುದು ಮತ್ತು ಬ್ಯಾಕ್‌ಪ್ರೆಶರ್ ಅನ್ನು ನಿರ್ವಹಿಸುವುದು ಬೃಹತ್ ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ಸುಲಭವಾಗಿ ನಿಭಾಯಿಸಬಲ್ಲ ದೃಢವಾದ ಮತ್ತು ಸಮರ್ಥವಾದ Node.js ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅತ್ಯಗತ್ಯ. ಈ ಲೇಖನದಲ್ಲಿ ವಿವರಿಸಿದ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಅನುಸರಿಸುವ ಮೂಲಕ, ನೀವು Node.js ಸ್ಟ್ರೀಮ್‌ಗಳ ಸಂಪೂರ್ಣ ಸಾಮರ್ಥ್ಯವನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು ಮತ್ತು ವ್ಯಾಪಕ ಶ್ರೇಣಿಯ ಡೇಟಾ-ತೀವ್ರ ಕಾರ್ಯಗಳಿಗಾಗಿ ಉನ್ನತ-ಕಾರ್ಯಕ್ಷಮತೆಯ, ಸ್ಕೇಲೆಬಲ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಬಹುದು.

ನಿಮ್ಮ Node.js ಅಭಿವೃದ್ಧಿಯಲ್ಲಿ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಹೊಸ ಮಟ್ಟದ ದಕ್ಷತೆ ಮತ್ತು ಸ್ಕೇಲೆಬಿಲಿಟಿಯನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ. ಡೇಟಾ ಪ್ರಮಾಣಗಳು ಬೆಳೆಯುತ್ತಲೇ ಇರುವುದರಿಂದ, ಡೇಟಾವನ್ನು ಸಮರ್ಥವಾಗಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಸಾಮರ್ಥ್ಯವು ಹೆಚ್ಚು ನಿರ್ಣಾಯಕವಾಗುತ್ತದೆ, ಮತ್ತು Node.js ಸ್ಟ್ರೀಮ್‌ಗಳು ಈ ಸವಾಲುಗಳನ್ನು ಎದುರಿಸಲು ಒಂದು ದೃಢವಾದ ಅಡಿಪಾಯವನ್ನು ಒದಗಿಸುತ್ತವೆ.