Jackson Streaming API JSON ডেটা প্রসেসিংয়ের জন্য একটি লো-লেভেল এবং মেমরি-অপ্টিমাইজড পদ্ধতি প্রদান করে। এটি বিশেষভাবে উপযোগী যখন ডেটাসেট খুব বড় হয় বা লো-লেভেল কন্ট্রোল প্রয়োজন হয়।
Streaming API কেন ব্যবহার করবেন?
- লাইটওয়েট এবং দ্রুত: Streaming API, DOM এবং Data Binding পদ্ধতির তুলনায় দ্রুত কারণ এটি মেমোরিতে সম্পূর্ণ JSON লোড না করে একটি স্ট্রিম হিসেবে JSON প্রসেস করে।
- মেমরি অপ্টিমাইজড: বড় JSON ফাইল নিয়ে কাজ করার সময় মেমরি খরচ কম হয়।
- Partial Processing: পুরো JSON প্রসেস করার প্রয়োজন না হলে নির্দিষ্ট অংশ পড়তে বা লিখতে সুবিধা হয়।
1. Streaming API: দুটি প্রধান অংশ
(a) JsonParser: JSON ডেটা পড়ার জন্য।
(b) JsonGenerator: JSON ডেটা লেখার জন্য।
2. উদাহরণ: JsonParser দিয়ে JSON পড়া
নিচে একটি উদাহরণ দেওয়া হলো যেখানে Streaming API ব্যবহার করে JSON ডেটা পার্স করা হয়েছে।
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.File;
import java.io.IOException;
public class JacksonStreamingReadExample {
public static void main(String[] args) {
JsonFactory jsonFactory = new JsonFactory();
try (JsonParser parser = jsonFactory.createParser(new File("data.json"))) {
while (!parser.isClosed()) {
JsonToken token = parser.nextToken();
if (token == null) {
break;
}
if (JsonToken.FIELD_NAME.equals(token)) {
String fieldName = parser.getCurrentName();
parser.nextToken(); // Move to the value
if ("name".equals(fieldName)) {
System.out.println("Name: " + parser.getValueAsString());
} else if ("age".equals(fieldName)) {
System.out.println("Age: " + parser.getValueAsInt());
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
JSON ইনপুট (data.json):
{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Dhaka"
}
}
আউটপুট:
Name: John Doe
Age: 30
3. উদাহরণ: JsonGenerator দিয়ে JSON লেখা
নিচে একটি উদাহরণ দেওয়া হলো যেখানে Streaming API ব্যবহার করে JSON ডেটা তৈরি করা হয়েছে।
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import java.io.File;
import java.io.IOException;
public class JacksonStreamingWriteExample {
public static void main(String[] args) {
JsonFactory jsonFactory = new JsonFactory();
try (JsonGenerator generator = jsonFactory.createGenerator(new File("output.json"))) {
generator.writeStartObject(); // Start JSON Object
generator.writeStringField("name", "John Doe");
generator.writeNumberField("age", 30);
generator.writeFieldName("address");
generator.writeStartObject(); // Start nested object
generator.writeStringField("street", "123 Main St");
generator.writeStringField("city", "Dhaka");
generator.writeEndObject(); // End nested object
generator.writeEndObject(); // End JSON Object
} catch (IOException e) {
e.printStackTrace();
}
}
}
আউটপুট (output.json):
{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Dhaka"
}
}
4. Performance Optimization টিপস
(a) Chunked Processing:
বড় JSON ফাইল সরাসরি মেমোরিতে না নিয়ে স্ট্রিম হিসেবে প্রসেস করুন।
try (JsonParser parser = jsonFactory.createParser(new File("large.json"))) {
while (parser.nextToken() != JsonToken.END_OBJECT) {
// শুধুমাত্র প্রয়োজনীয় ডেটা পড়ুন
}
}
(b) Avoid DOM-based Processing:
ObjectMapper দিয়ে পুরো JSON লোড না করে Streaming API ব্যবহার করুন।
(c) Lazy Loading:
জ্যাকসনের JsonParser মডেল ব্যবহার করলে প্রয়োজনীয় ডেটা Lazy Load করতে পারেন।
5. Use Cases
- Big Data Processing: বিশাল JSON ডেটা ফাইল প্রসেস করা।
- Low Memory Environments: সীমিত মেমরি ব্যবহার করে ডেটা পার্স করা।
- Partial Updates: JSON ফাইলের নির্দিষ্ট অংশ আপডেট করা।
6. সীমাবদ্ধতা
- কোড জটিলতা: Streaming API ব্যবহার করলে কোড কিছুটা জটিল হতে পারে।
- Manual Handling: প্রতিটি JSON টোকেন ম্যানুয়ালি প্রসেস করতে হয়।
Jackson Streaming API, বড় JSON ডেটা প্রসেসিং এবং মেমরি অপ্টিমাইজেশনের জন্য একটি শক্তিশালী টুল। তবে এটি ব্যবহারের জন্য লো-লেভেল লজিক লিখতে হয়। যদি আপনার ডেটাসেট বড় বা মেমরি সীমাবদ্ধতা থাকে, তবে এটি একটি আদর্শ সমাধান।
Read more