Java NIO (New I/O) একটি অত্যন্ত কার্যকরী এবং নমনীয় I/O লাইব্রেরি, যা ইনপুট এবং আউটপুট অপারেশনকে আরও দ্রুত এবং দক্ষভাবে পরিচালনা করতে সাহায্য করে। এর মধ্যে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল Memory-Mapped Files, যা ফাইলের একটি অংশকে সরাসরি মেমরির সাথে মানচিত্রিত (map) করে। এটি ডেটা পড়া এবং লেখার জন্য দ্রুততম পদ্ধতি এবং বৃহৎ ফাইলের সাথে কাজ করার সময় পারফরম্যান্স বৃদ্ধি করতে সহায়ক।
Memory-Mapped Files ফাইলের ডেটাকে মেমরি স্পেসে ম্যাপ করে, যা অ্যাক্সেস করার জন্য CPU এবং মেমরি প্রোডাক্টিভিটি বৃদ্ধি করে। Java NIO এর MappedByteBuffer ব্যবহার করে মেমরি-ম্যাপড ফাইল অপারেশনগুলি সহজে করা যেতে পারে।
Memory-Mapped Files এর ধারণা
Memory-Mapped File হল এমন একটি পদ্ধতি, যেখানে একটি ফাইলের কিছু অংশকে সরাসরি মেমরি স্পেসে ম্যাপ করা হয়, যাতে ফাইলের ডেটা দ্রুত অ্যাক্সেস করা যায়। এতে ডেটাকে ফাইল সিস্টেম থেকে সরাসরি মেমরি দ্বারা পরিচালিত করা হয়, যা দ্রুত পঠন এবং লেখা নিশ্চিত করে। এটি বড় ফাইলগুলির সাথে কাজ করার জন্য অত্যন্ত উপকারী, বিশেষত যখন একাধিক থ্রেড বা প্রসেসের মাধ্যমে ডেটা অ্যাক্সেস করতে হয়।
Memory-Mapped File এর সুবিধা
- দ্রুত ডেটা অ্যাক্সেস: ফাইলের ডেটা সরাসরি মেমরিতে থাকে, তাই পঠন এবং লেখার সময় অনেক দ্রুত হয়।
- বড় ফাইল পরিচালনা: খুব বড় ফাইলের অংশগুলিকে মেমরিতে ম্যাপ করা যায়, যাতে সেগুলি ছোট অংশে অ্যাক্সেস করা যায়, যা সম্পূর্ণ ফাইল লোড করার থেকে অনেক বেশি কার্যকরী।
- থ্রেড নিরাপত্তা: একাধিক থ্রেডের মাধ্যমে ফাইলের অংশগুলোকে অ্যাক্সেস করা সম্ভব হয়, যা কনকারেন্ট অ্যাপ্লিকেশনগুলির জন্য কার্যকর।
Memory-Mapped Files ব্যবহার করার উদাহরণ
Java NIO এর মাধ্যমে Memory-Mapped Files ব্যবহার করা খুবই সহজ। এখানে আমরা একটি MappedByteBuffer ব্যবহার করে একটি ফাইলের কিছু অংশ মেমরির মধ্যে ম্যাপ করে ডেটা পড়া এবং লেখা দেখাবো।
১. ফাইল লেখার উদাহরণ
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class MemoryMappedFileWrite {
public static void main(String[] args) throws IOException {
// ফাইল তৈরি এবং চ্যানেল খোলা
RandomAccessFile file = new RandomAccessFile("example.dat", "rw");
FileChannel fileChannel = file.getChannel();
// মেমরি-ম্যানিপুলেটেড ফাইল তৈরির জন্য মেমরি ম্যাপিং করা
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// ডেটা লেখা
String data = "Hello, Java NIO!";
mappedByteBuffer.put(data.getBytes());
// ফাইল বন্ধ করা
file.close();
System.out.println("Data written to the file using memory-mapped file.");
}
}
এখানে, আমরা RandomAccessFile ব্যবহার করে একটি ফাইল তৈরি করেছি এবং MappedByteBuffer ব্যবহার করে তার প্রথম 1024 বাইট মেমরির মধ্যে ম্যাপ করেছি। এরপর আমরা "Hello, Java NIO!" স্ট্রিংটি ফাইলে লিখে দিয়েছি।
২. ফাইল পড়ার উদাহরণ
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class MemoryMappedFileRead {
public static void main(String[] args) throws IOException {
// ফাইল খোলা
RandomAccessFile file = new RandomAccessFile("example.dat", "r");
FileChannel fileChannel = file.getChannel();
// মেমরি-ম্যানিপুলেটেড ফাইল থেকে ডেটা পড়া
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
// ডেটা পড়া এবং প্রিন্ট করা
byte[] bytes = new byte[mappedByteBuffer.remaining()];
mappedByteBuffer.get(bytes);
System.out.println("Data read from the file: " + new String(bytes));
// ফাইল বন্ধ করা
file.close();
}
}
এখানে, MappedByteBuffer ব্যবহার করে আমরা "example.dat" ফাইল থেকে ডেটা পড়েছি। ফাইলের সম্পূর্ণ ডেটা মেমরির মধ্যে ম্যাপ করা হয়েছে, এবং তারপর MappedByteBuffer.get() পদ্ধতির মাধ্যমে ডেটা পড়া হয়েছে।
৩. বড় ফাইলের অংশ ম্যাপ করা
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class LargeFileMapping {
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("large_example.dat", "rw");
FileChannel fileChannel = file.getChannel();
// ফাইলের প্রথম 1024 বাইট ম্যাপ করা
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
mappedByteBuffer.put("First 1024 bytes".getBytes());
// দ্বিতীয় অংশের জন্য অন্য একটি ম্যাপ করা
MappedByteBuffer secondPart = fileChannel.map(FileChannel.MapMode.READ_WRITE, 1024, 1024);
secondPart.put("Next 1024 bytes".getBytes());
// ফাইল বন্ধ করা
file.close();
}
}
এখানে, একটি বড় ফাইলের দুটি আলাদা অংশে ডেটা লিখেছি। প্রথমে 1024 বাইট এবং তারপর দ্বিতীয় অংশের জন্য অন্য একটি MappedByteBuffer ব্যবহার করা হয়েছে।
Memory-Mapped Files Java NIO এর একটি শক্তিশালী বৈশিষ্ট্য যা ফাইলের ডেটা দ্রুত এবং কার্যকরীভাবে মেমরি স্পেসে ম্যাপ করে, যা অনেক দ্রুত ডেটা অ্যাক্সেস এবং ফাইল I/O অপারেশন সম্পন্ন করতে সহায়ক। MappedByteBuffer ব্যবহার করে আপনি বড় ফাইলের ডেটা পড়তে এবং লিখতে পারেন, যা আপনার অ্যাপ্লিকেশনকে দ্রুত এবং স্কেলেবল করে তোলে।
এই পদ্ধতি বিশেষত যখন অনেক বড় ফাইলের সাথে কাজ করতে হয় এবং কার্যকরীভাবে ডেটা প্রক্রিয়া করতে হয়, তখন এটি অপরিহার্য হয়ে ওঠে।
Read more