Java NIO (New I/O) এর একটি শক্তিশালী বৈশিষ্ট্য হলো FileChannel, যা ফাইলের সাথে সম্পর্কিত বিভিন্ন ইনপুট/আউটপুট অপারেশন পরিচালনা করতে ব্যবহৃত হয়। বিশেষভাবে, Memory-Mapped Files তৈরি করার মাধ্যমে আপনি ডিস্কের ফাইলকে একটি প্রোগ্রামের মেমরির অংশ হিসেবে মানচিত্র (map) করতে পারেন, যার মাধ্যমে দ্রুত ডেটা অ্যাক্সেস করা সম্ভব হয়। এটি বড় ফাইলের সাথে কাজ করার জন্য কার্যকরী, কারণ এতে ফাইলের সবটা মেমরিতে লোড করতে হয় না—যতটুকু প্রয়োজন ততটুকু মেমরি ব্যবহার করা হয়।
Java NIO তে FileChannel ব্যবহার করে Memory-Mapped Files তৈরি করা হয়, যা ফাইলের ডেটাকে সরাসরি মেমরিতে ম্যাপ করে এবং অ্যাক্সেসের জন্য দ্রুতগতির I/O প্রদান করে।
Memory-Mapped File এর ধারণা
Memory-Mapped File একটি ফাইল, যা মেমরিতে ম্যাপ করা হয় এবং আপনার প্রোগ্রাম সরাসরি মেমরি থেকে সেই ফাইলের ডেটা অ্যাক্সেস করতে পারে। এতে করে ফাইলের ডেটাকে ইন-প্লেস পরিবর্তন বা পড়া সম্ভব হয়, এবং এতে সিস্টেমের পারফরম্যান্সও বৃদ্ধি পায়, কারণ ফাইলের ডেটা সরাসরি মেমরি থেকে পড়া হয়।
Memory-Mapped File এর সুবিধা
- দ্রুত ডেটা অ্যাক্সেস: ফাইলের ডেটা সরাসরি মেমরি থেকে অ্যাক্সেস করা যায়, যা ডিস্ক থেকে পড়ার তুলনায় দ্রুত।
- বড় ফাইলের জন্য উপকারী: বড় ফাইলের জন্য, ফাইলের পুরোটা মেমরিতে লোড না করে প্রয়োজনীয় অংশে কাজ করা সম্ভব।
- ডেটার উপর সরাসরি কাজ: মেমরি-অভিযুক্ত ডেটার সাথে সরাসরি কাজ করা সম্ভব, যেমন রিড/রাইট করা এবং ম্যানিপুলেট করা।
FileChannel এর মাধ্যমে Memory-Mapped Files তৈরি করা
Java NIO তে FileChannel ব্যবহার করে Memory-Mapped File তৈরি করা যায়। আপনি FileChannel.map() মেথড ব্যবহার করে একটি ফাইলের নির্দিষ্ট অংশ মেমরিতে ম্যাপ করতে পারেন। এর মাধ্যমে আপনি ফাইলের একটি অংশ বা পুরো ফাইলকে মেমরিতে লোড করতে পারেন এবং সেই অংশে সরাসরি কাজ করতে পারেন।
উদাহরণ: FileChannel এর মাধ্যমে Memory-Mapped File তৈরি করা
এই উদাহরণে একটি ফাইলের একটি অংশ মেমরি-অ্যাড্রেস স্পেসে ম্যাপ করা হবে এবং সেই অংশে রিড/রাইট অপারেশন করা হবে।
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class MemoryMappedFileExample {
public static void main(String[] args) {
try {
// ফাইলের পাথ এবং FileChannel তৈরি করা
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel fileChannel = file.getChannel();
// ফাইলের 0 থেকে শুরু করে 1024 বাইট ম্যাপ করা
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// মেমরি ম্যাপ করা ফাইলের অংশে কিছু ডেটা লিখা
buffer.put(0, (byte) 97); // 'a' লেখা হবে ফাইলের প্রথম বাইটে
// একইভাবে ডেটা পড়া
byte readByte = buffer.get(0);
System.out.println("Read byte: " + (char) readByte);
// ফাইল চ্যানেল বন্ধ করা
fileChannel.close();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
কোড বিশ্লেষণ:
- RandomAccessFile: একটি
RandomAccessFileঅবজেক্ট ব্যবহার করে ফাইল খোলা হয়। এটিrwমোডে খোলা হয়েছে, যার মানে হলো ফাইলটি পড়া এবং লেখা উভয়ই যাবে। - FileChannel: ফাইলের একটি
FileChannelঅবজেক্ট তৈরি করা হয়, যা ফাইলের সাথে I/O অপারেশন পরিচালনা করতে ব্যবহৃত হয়। - map() মেথড:
fileChannel.map()মেথড ব্যবহার করা হয়, যেখানে ফাইলের 0 থেকে 1024 বাইট একটিMappedByteBufferএর মাধ্যমে মেমরিতে ম্যাপ করা হয়। এই মেমরি অংশে সরাসরি রিড এবং রাইট করা যায়। - put() মেথড: মেমরি ম্যাপড ফাইলের নির্দিষ্ট অংশে ডেটা লেখা হয় (এখানে, প্রথম বাইটে 'a' লেখা হচ্ছে)।
- get() মেথড: মেমরি ম্যাপড ফাইল থেকে ডেটা পড়া হয়।
MappedByteBuffer এর মাধ্যমে কাজ করা
MappedByteBuffer Java NIO এর একটি ক্লাস, যা মেমরি ম্যাপড ফাইলের ডেটার অ্যাক্সেস প্রদান করে। এটি একটি বিশেষ ধরনের বাফার, যা ফাইলের ডেটা সরাসরি মেমরিতে ম্যানেজ করে। আপনি এই বাফার ব্যবহার করে ফাইলের ডেটার উপর কাজ করতে পারেন, যেমন:
- put(): ডেটা লেখা
- get(): ডেটা পড়া
- flip(): বাফারটি প্রস্তুত করা (যখন রিড এবং রাইট অপারেশন করা হয়)
উদাহরণ: Memory-Mapped File-এ অ্যাসিঙ্ক্রোনাস রিড এবং রাইট
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class AsyncMemoryMappedFile {
public static void main(String[] args) throws IOException {
// ফাইল খোলা
RandomAccessFile file = new RandomAccessFile("async_example.txt", "rw");
FileChannel fileChannel = file.getChannel();
// ফাইলের প্রথম 1024 বাইট মেমরিতে ম্যাপ করা
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// অ্যাসিঙ্ক্রোনাসভাবে ডেটা লেখা
buffer.put(0, (byte) 65); // 'A' লেখা
buffer.put(1, (byte) 66); // 'B' লেখা
// অ্যাসিঙ্ক্রোনাসভাবে ডেটা পড়া
byte b1 = buffer.get(0);
byte b2 = buffer.get(1);
System.out.println("First byte: " + (char) b1);
System.out.println("Second byte: " + (char) b2);
// ফাইল চ্যানেল বন্ধ করা
fileChannel.close();
file.close();
}
}
ব্যাখ্যা:
- এই কোডে
MappedByteBufferএর মাধ্যমে অ্যাসিঙ্ক্রোনাস রিড এবং রাইট অপারেশন করা হচ্ছে। - প্রথমে মেমরি ম্যাপ করা অংশে ডেটা লেখা হচ্ছে, এরপর সেই ডেটা মেমরি থেকে পড়া হচ্ছে।
Memory-Mapped Files এর সুবিধা
- দ্রুত I/O অপারেশন: মেমরি-অ্যাড্রেসড ফাইল থেকে সরাসরি ডেটা পড়া বা লেখা দ্রুত হয়, কারণ ডেটা মেমরিতে সরাসরি পাওয়া যায়, ডিস্ক থেকে রিড/রাইট করার প্রয়োজন হয় না।
- বড় ফাইলের কার্যকরী ব্যবস্থাপনা: বড় বড় ফাইলের সাথে কাজ করার জন্য মেমরি ম্যাপিং উপকারী, যেখানে পুরো ফাইল মেমরিতে লোড না করেই ছোট ছোট অংশে কাজ করা যায়।
- কম রিসোর্স ব্যবহার: মেমরি ম্যাপিংয়ের মাধ্যমে কম রিসোর্স ব্যবহার করা সম্ভব হয় কারণ শুধুমাত্র প্রয়োজনীয় অংশই মেমরিতে লোড করা হয়।
Memory-Mapped Files Java NIO এর একটি শক্তিশালী বৈশিষ্ট্য যা ফাইলের ডেটাকে মেমরির অংশ হিসেবে ম্যাপ করে দ্রুত I/O অপারেশন করতে সহায়ক। FileChannel.map() মেথড ব্যবহার করে ফাইলের নির্দিষ্ট অংশ মেমরিতে ম্যাপ করা হয় এবং আপনি সেই অংশে রিড/রাইট অপারেশন করতে পারেন। এটি বড় ফাইলের জন্য বিশেষভাবে কার্যকরী, কারণ ফাইলের পুরোটা মেমরিতে লোড না করে প্রয়োজনীয় অংশে কাজ করা যায়, যা সিস্টেমের পারফরম্যান্স এবং রিসোর্স ব্যবহারের দক্ষতা বৃদ্ধি করে।
Read more