Java 8 এর Parallel Stream API এর ভূমিকা

Java Technologies - জাভা কনকারেন্সি (Java Concurrency) - Parallel Streams এবং Java 8 Concurrency
266

Java 8 Parallel Stream API হলো একটি শক্তিশালী টুল যা parallelism ব্যবহার করে ডেটা প্রসেসিং সহজ এবং কার্যকরী করে। এটি মূলত বড় ডেটাসেট প্রক্রিয়াকরণে পারফরম্যান্স বৃদ্ধি করতে সাহায্য করে। Parallel Stream ব্যবহার করলে ফর্ক-জয়েন ফ্রেমওয়ার্ক (Fork-Join Framework) এর মাধ্যমে স্বয়ংক্রিয়ভাবে একাধিক থ্রেড ব্যবহার করা হয়।


Parallel Stream API এর ভূমিকা

  1. ডেটা প্রক্রিয়াকরণে গতি বৃদ্ধি:
    • Parallel Stream একই ডেটাসেটের উপাদানগুলোকে সমান্তরালভাবে (parallelly) প্রক্রিয়াকরণ করে গতি বৃদ্ধি করে।
  2. মাল্টি-কোর প্রসেসরের ব্যবহার:
    • Parallel Stream মাল্টি-কোর প্রসেসরের সম্পূর্ণ ক্ষমতা ব্যবহার করে।
  3. কোড সরলতা:
    • মাল্টি-থ্রেডিং বা থ্রেড ম্যানেজমেন্টের প্রয়োজন ছাড়াই সমান্তরাল প্রসেসিং করা যায়।
  4. ফর্ক-জয়েন ফ্রেমওয়ার্ক ব্যবহার:
    • এটি কাজগুলোকে ছোট ছোট সাবটাস্কে ভাগ করে সমান্তরালভাবে প্রক্রিয়াকরণ করে এবং তারপর রেজাল্টগুলো একত্রিত করে।

Parallel Stream API এর ব্যবহার

১. সাধারণ Stream vs Parallel Stream

Parallel Stream এর মাধ্যমে একাধিক থ্রেড ব্যবহার করা হয়, যেখানে সাধারণ Stream একটি থ্রেডে কাজ করে।

import java.util.stream.IntStream;

public class ParallelStreamExample {
    public static void main(String[] args) {
        System.out.println("Normal Stream:");
        IntStream.range(1, 10).forEach(System.out::println);

        System.out.println("\nParallel Stream:");
        IntStream.range(1, 10).parallel().forEach(System.out::println);
    }
}

আউটপুট:

  • Normal Stream: 1 থেকে 9 পর্যন্ত সিরিয়াল আউটপুট।
  • Parallel Stream: 1 থেকে 9 পর্যন্ত অনিয়মিত (non-deterministic) ক্রমে আউটপুট, কারণ এটি একাধিক থ্রেড ব্যবহার করে।

২. লিস্ট প্রসেসিং

import java.util.Arrays;
import java.util.List;

public class ListParallelStreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Tom", "Emily");

        // Parallel Stream ব্যবহার
        names.parallelStream()
             .forEach(name -> System.out.println(Thread.currentThread().getName() + " processing " + name));
    }
}

বৈশিষ্ট্য:

  • প্রতিটি নাম একটি ভিন্ন থ্রেডে প্রক্রিয়াকরণ হতে পারে।

৩. ফিল্টার এবং ম্যাপ অপারেশন

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ParallelStreamFilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

        List<Integer> evenNumbers = numbers.parallelStream()
                                           .filter(n -> n % 2 == 0)
                                           .map(n -> n * 2)
                                           .collect(Collectors.toList());

        System.out.println("Processed Even Numbers: " + evenNumbers);
    }
}

Parallel Stream ব্যবহার করার সুবিধা

  1. পারফরম্যান্স বৃদ্ধি:
    • বড় ডেটাসেটের ক্ষেত্রে প্রসেসিং টাইম উল্লেখযোগ্যভাবে কমে যায়।
  2. সহজ ইমপ্লিমেন্টেশন:
    • মাল্টি-থ্রেডিং কোড না লিখেই সমান্তরাল প্রসেসিং করা যায়।
  3. অটোমেটিক থ্রেড ম্যানেজমেন্ট:
    • ফর্ক-জয়েন পুল স্বয়ংক্রিয়ভাবে থ্রেড ম্যানেজ করে।
  4. মাল্টি-কোর প্রসেসর ব্যবহার:
    • মাল্টি-কোর প্রসেসর থেকে সর্বাধিক পারফরম্যান্স পাওয়া যায়।

Parallel Stream ব্যবহার করার সীমাবদ্ধতা

  1. সিঙ্ক্রোনাইজেশন ঝুঁকি:
    • শেয়ারড রিসোর্স বা মিউটেবল ডেটার ক্ষেত্রে ডেটা রেস হতে পারে।
  2. ছোট ডেটাসেটে পারফরম্যান্স কমে যায়:
    • Parallel Stream ছোট ডেটাসেটের জন্য অপ্রয়োজনীয় থ্রেড ম্যানেজমেন্টের কারণে ধীর হতে পারে।
  3. অপটিমাইজেশনের অভাব:
    • Parallel Stream সব ধরনের কাজের জন্য পারফরম্যান্স বাড়াবে না। কিছু নির্দিষ্ট কাজ সিরিয়াল স্ট্রিমে দ্রুত হতে পারে।
  4. ডিবাগিং কঠিন:
    • একাধিক থ্রেডের কারণে Parallel Stream এর ডিবাগিং জটিল হতে পারে।

Parallel Stream এর Best Practices

  1. ছোট ডেটাসেট এড়িয়ে চলুন:
    • Parallel Stream বড় ডেটাসেটের জন্য উপযোগী।
  2. I/O-বাউন্ড কাজের জন্য ব্যবহার করবেন না:
    • CPU-বাউন্ড কাজের জন্য এটি বেশি কার্যকর। I/O-নির্ভর কাজ সিরিয়াল স্ট্রিমে ভালো হয়।
  3. স্ট্রিম অর্ডারিং প্রয়োজন হলে সতর্ক থাকুন:

    • Parallel Stream এর আউটপুট ক্রম অগত্যা অর্ডার মেনে চলবে না। forEachOrdered() ব্যবহার করতে পারেন যদি অর্ডার প্রয়োজন হয়।
    IntStream.range(1, 10).parallel().forEachOrdered(System.out::println);
    
  4. মিউটেবল অবজেক্ট ব্যবহার করবেন না:
    • Immutable বা Thread-Safe ডেটা স্ট্রাকচার ব্যবহার করুন।
  5. Custom Thread Pool প্রয়োজন হলে ব্যবহার করুন:

    • ForkJoinPool কাস্টমাইজ করে কন্ট্রোল বাড়ানো যায়।
    ForkJoinPool customPool = new ForkJoinPool(4);
    customPool.submit(() -> {
        IntStream.range(1, 10).parallel().forEach(System.out::println);
    }).join();
    

Java 8 এর Parallel Stream API ডেটা প্রক্রিয়াকরণের সময় সমান্তরাল প্রসেসিং সহজ এবং কার্যকরী করে। এটি বড় ডেটাসেট এবং CPU-বাউন্ড টাস্কগুলোর জন্য পারফেক্ট, তবে এর সীমাবদ্ধতাগুলো বুঝে সঠিকভাবে ব্যবহার করা উচিত। Parallel Stream ব্যবহার করলে প্রোগ্রামের কার্যকারিতা বাড়ানো সম্ভব, তবে ভুল ব্যবহারে পারফরম্যান্স কমে যেতে পারে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...