Streams এর ধারণা এবং প্রয়োজনীয়তা

Streams এবং Buffers (স্ট্রিম এবং বাফার) - নোড জেএস (Node.js) - Computer Programming

579

Streams হল একটি গুরুত্বপূর্ণ কনসেপ্ট, যা Node.js এর I/O (Input/Output) অপারেশনকে আরও কার্যকরী এবং স্কেলেবল করে তোলে। এটি ডেটা প্রক্রিয়াকরণের একটি ধারাবাহিক পদ্ধতি, যেখানে আপনি একটি বড় ডেটা সেট (যেমন ফাইল, নেটওয়ার্ক ডেটা) একসাথে না নিয়ে আসলে, ডেটার উপর বিভিন্ন অপারেশন করে যেতে পারেন। Node.js এ, Streams বিশেষ করে বড় আকারের ডেটা বা রিয়েল-টাইম ডাটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়।

Streams এর মাধ্যমে আপনি ডেটাকে পিসে পিসে প্রসেস করতে পারেন, যার ফলে পুরো ডেটা একসাথে মেমোরিতে না রেখে, কম মেমোরি ব্যবহার করে দ্রুত কাজ করতে পারেন।


১. Streams এর মৌলিক ধারণা

Streams হলো data flow এর একটি ধরনের অবজেক্ট, যা নির্দিষ্ট আকারের ডেটা তৈরি বা গ্রহণ করে। Streams সাধারণত চার ধরনের হয়:

  1. Readable Streams: এই ধরনের স্ট্রিম থেকে ডেটা পড়া যায়। উদাহরণ: ফাইল থেকে ডেটা পড়া, HTTP রিকোয়েস্ট থেকে ডেটা গ্রহণ।
  2. Writable Streams: এই ধরনের স্ট্রিমে ডেটা লেখা যায়। উদাহরণ: ফাইলে ডেটা লেখা, HTTP রেসপন্সে ডেটা পাঠানো।
  3. Duplex Streams: এই ধরনের স্ট্রিমে ডেটা উভয় দিকে (পড়া এবং লেখা) প্রবাহিত হয়। উদাহরণ: TCP sockets।
  4. Transform Streams: এটি একটি বিশেষ ধরনের Duplex stream, যেখানে ডেটা প্রক্রিয়া করার সময় লেখা ও পড়ার মধ্যে পরিবর্তন করা হয়। উদাহরণ: এনক্রিপশন বা কম্প্রেশন।

২. Streams এর প্রয়োজনীয়তা

Streams ব্যবহারের মাধ্যমে কিছু বিশেষ সুবিধা পাওয়া যায়, যা বড় আকারের অ্যাপ্লিকেশন বা ডেটা ইন্টারঅ্যাকশনকে আরও কার্যকরী করে:

a. কম মেমোরি ব্যবহারের সুবিধা:

  • একসাথে সব ডেটা মেমোরিতে না রেখে, আপনি পিসে পিসে ডেটা প্রক্রিয়া করতে পারেন। ফলে সিস্টেমের মেমোরি ব্যবহারের চাপ কমে যায়।
  • উদাহরণ: যদি একটি বড় ফাইল পড়া হয়, তখন স্ট্রিম ব্যবহার করলে পুরো ফাইল একসাথে মেমোরিতে লোড না হয়ে, পিসে পিসে লোড হবে।

b. রিয়েল-টাইম ডেটা প্রক্রিয়াকরণ:

  • Streams দিয়ে আপনি ডেটা একযোগভাবে প্রবাহিত করতে পারেন, যেমন রিয়েল-টাইম ফাইল আপলোড বা ডাউনলোড, ভিডিও স্ট্রিমিং, ইত্যাদি। এর মাধ্যমে ডেটা প্রক্রিয়া হওয়ার সাথে সাথে তা পাঠানো সম্ভব হয়।

c. দ্রুত পারফরম্যান্স:

  • স্ট্রিম ব্যবহার করে, ডেটা প্রক্রিয়াকরণ দ্রুত হয় কারণ আপনি এক সময়ের মধ্যে একাধিক ডেটা অপারেশন করতে পারেন। যেমন, আপনি ডেটা পড়তে পড়তে তা ট্রান্সফর্ম করতে বা প্রেরণ করতে পারেন।

d. অ্যাসিনক্রোনাস অপারেশন:

  • Streams অ্যাসিনক্রোনাস অপারেশন সরবরাহ করে, যার মানে হল যে আপনার কোড ব্লক হয় না এবং অন্য কাজগুলি চলতে থাকে, যতক্ষণ না স্ট্রিম অপারেশন সম্পন্ন হয়।

৩. Streams এর উদাহরণ

a. Readable Stream (ফাইল পড়ার উদাহরণ)

Node.js এ fs.createReadStream() ফাংশন ব্যবহার করে আপনি ফাইল থেকে ডেটা পড়ে স্ট্রিম করতে পারেন।

const fs = require('fs');

// ফাইল থেকে ডেটা পড়া
const readableStream = fs.createReadStream('largefile.txt', 'utf8');

// স্ট্রিমে ডেটা পড়ার সময়, ডেটা লগ করা
readableStream.on('data', (chunk) => {
  console.log('Reading data chunk:', chunk);
});

// স্ট্রিম শেষ হলে
readableStream.on('end', () => {
  console.log('File read complete.');
});

এখানে, ফাইলটি একবারে পুরোপুরি না পড়ে, স্ট্রিমের মাধ্যমে ডেটা পিসে পিসে পড়া হচ্ছে।

b. Writable Stream (ফাইলে ডেটা লেখা)

const fs = require('fs');

// ফাইলে ডেটা লেখা
const writableStream = fs.createWriteStream('output.txt');

// ডেটা লেখার সময়
writableStream.write('Hello, this is some data!\n');
writableStream.write('Another line of text!\n');

// লেখার পর স্ট্রিম বন্ধ করা
writableStream.end(() => {
  console.log('Writing complete.');
});

এখানে, ডেটা ফাইলে স্ট্রিমের মাধ্যমে লেখা হচ্ছে এবং শেষে স্ট্রিমটি বন্ধ করা হচ্ছে।

c. Duplex Stream (টিসিপি সোকেট)

const net = require('net');

// টিসিপি সোকেট তৈরি করা
const server = net.createServer((socket) => {
  socket.write('Hello, client!\n');
  socket.on('data', (data) => {
    console.log('Received from client:', data.toString());
  });
});

server.listen(8080, () => {
  console.log('Server is listening on port 8080');
});

এখানে, net.createServer() একটি duplex স্ট্রিম তৈরি করছে যেখানে একে অপরের সাথে ডেটা পাঠানো এবং গ্রহণ করা যাচ্ছে।


৪. Transform Stream (ডেটা ট্রান্সফর্ম)

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

// একটি ট্রান্সফর্ম স্ট্রিম তৈরি করা
const transformStream = new Transform({
  transform(chunk, encoding, callback) {
    // ডেটার পেছনে কিছু পরিবর্তন করা
    this.push(chunk.toString().toUpperCase()); // টেক্সটকে uppercase করা
    callback();
  }
});

// ইনপুট স্ট্রিমের মাধ্যমে ডেটা পাঠানো
process.stdin.pipe(transformStream).pipe(process.stdout);

এখানে, একটি transform stream তৈরি করা হয়েছে, যেখানে ইনপুট ডেটা কনভার্ট করা হচ্ছে এবং তারপর আউটপুট হিসেবে পাঠানো হচ্ছে।


সারাংশ

Streams হল Node.js এর একটি গুরুত্বপূর্ণ কনসেপ্ট যা অ্যাসিনক্রোনাস এবং non-blocking ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়। Streams ব্যবহার করে আপনি কম মেমোরি ব্যবহার করে বড় আকারের ডেটা প্রক্রিয়া করতে পারেন এবং রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে পারেন। Readable, Writable, Duplex, এবং Transform স্ট্রিমগুলি Node.js এর I/O অপারেশন আরও দক্ষ এবং দ্রুত করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...