Parallel Streams এর মাধ্যমে Performance Optimization

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

Parallel Streams জাভার Streams API এর একটি অংশ, যা Fork/Join Framework ব্যবহার করে ডেটা প্রসেসিংকে মাল্টিপ্রসেসর কোরে ভাগ করে। এটি বড় ডেটা সেটের জন্য পারফরম্যান্স উন্নত করে এবং প্রোগ্রামিংকে আরও কার্যকর ও সহজ করে তোলে।


Parallel Streams এর বৈশিষ্ট্য

  1. অ্যাসিঙ্ক্রোনাস প্রসেসিং: একাধিক থ্রেড ব্যবহার করে কাজ ভাগ করে।
  2. ডেটা প্যারালেলিজম: ডেটা অংশগুলো আলাদাভাবে প্রসেস হয়।
  3. ডিফল্ট থ্রেড পুল: JVM-এর common ForkJoinPool ব্যবহার করে, যা থ্রেড সংখ্যা কন্ট্রোল করে।
  4. সহজ সিনট্যাক্স: সাধারণ streams থেকে সহজেই প্যারালেল স্ট্রিমে রূপান্তর করা যায়।

Parallel Streams এর ব্যবহার

১. সাধারণ Parallel Streams উদাহরণ

import java.util.List;
import java.util.stream.IntStream;

public class ParallelStreamExample {
    public static void main(String[] args) {
        // বড় ডেটা সেট তৈরি
        List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();

        // Sequential Stream
        long startTime = System.currentTimeMillis();
        numbers.stream().forEach(ParallelStreamExample::process);
        long endTime = System.currentTimeMillis();
        System.out.println("Sequential Stream Time: " + (endTime - startTime) + " ms");

        // Parallel Stream
        startTime = System.currentTimeMillis();
        numbers.parallelStream().forEach(ParallelStreamExample::process);
        endTime = System.currentTimeMillis();
        System.out.println("Parallel Stream Time: " + (endTime - startTime) + " ms");
    }

    private static void process(Integer number) {
        try {
            Thread.sleep(1); // প্রতিটি আইটেম প্রক্রিয়া করতে সময় নেয়
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Sequential Stream Time: 10000 ms
Parallel Stream Time: ~2000 ms

২. Parallel Streams এর মাধ্যমে ডেটা ফিল্টার ও ম্যাপ করা

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

public class ParallelStreamFilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();

        // Parallel Stream ব্যবহার করে ফিল্টার ও ম্যাপ করা
        List<Integer> evenNumbers = numbers.parallelStream()
                .filter(n -> n % 2 == 0) // শুধুমাত্র জোড় সংখ্যা ফিল্টার
                .map(n -> n * n)         // প্রতিটি সংখ্যা স্কয়ার
                .collect(Collectors.toList());

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

Parallel Streams এর সুবিধা

  1. পারফরম্যান্স বৃদ্ধি: বড় ডেটা সেট প্রক্রিয়াকরণের সময় কম লাগে।
  2. সহজ ব্যবহার: Streams API এর উপর ভিত্তি করে সহজেই ব্যবহার করা যায়।
  3. কোর ইউটিলাইজেশন: মাল্টি-কোর প্রসেসর ব্যবহার করে কাজ ভাগ করা হয়।

Parallel Streams এর সীমাবদ্ধতা

  1. থ্রেড-সেফটি: যদি ডেটা স্ট্রাকচার থ্রেড-সেফ না হয়, তাহলে ConcurrentModificationException হতে পারে।
  2. কিছু ছোট ডেটাসেটে ওভারহেড: Parallel Streams ছোট ডেটাসেটের জন্য ওভারহেড তৈরি করতে পারে।
  3. উন্নত নিয়ন্ত্রণের অভাব: থ্রেড সংখ্যা সরাসরি নিয়ন্ত্রণ করা সম্ভব নয়; JVM এটি পরিচালনা করে।

Parallel Streams ব্যবহার করার সময় সতর্কতা

১. সাইড এফেক্ট এড়ানো

যদি স্ট্রিমে কোনো সাইড এফেক্ট থাকে (যেমন ডেটা মডিফিকেশন), তাহলে Parallel Streams ব্যবহার না করাই ভালো।

// ভুল ব্যবহার: সাইড এফেক্ট সৃষ্টি করে
List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();
List<Integer> results = new ArrayList<>();

numbers.parallelStream().forEach(n -> results.add(n * n)); // ConcurrentModificationException হতে পারে

২. সংক্ষিপ্ত প্রসেসিং

Parallel Streams শুধুমাত্র বড় ডেটাসেটের জন্য উপযোগী। ছোট ডেটাসেটের জন্য sequential() ব্যবহার করুন।


Parallel Streams বনাম Sequential Streams

প্যারামিটারSequential StreamsParallel Streams
প্রসেসিং মডেলএকক থ্রেড ব্যবহার করে।একাধিক থ্রেড ব্যবহার করে।
পারফরম্যান্সছোট ডেটাসেটের জন্য কার্যকর।বড় ডেটাসেটের জন্য কার্যকর।
সিনট্যাক্সstream() ব্যবহার করে।parallelStream() ব্যবহার করে।
থ্রেড কন্ট্রোলকোনো থ্রেড ব্যবস্থাপনা নেই।JVM স্বয়ংক্রিয়ভাবে থ্রেড নিয়ন্ত্রণ করে।

Parallel Streams এর কাস্টম থ্রেড পুল ব্যবহার

import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;

public class CustomParallelStreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = IntStream.range(1, 10001).boxed().toList();

        ForkJoinPool customThreadPool = new ForkJoinPool(4); // কাস্টম থ্রেড পুল তৈরি
        try {
            customThreadPool.submit(() -> {
                numbers.parallelStream().forEach(CustomParallelStreamExample::process);
            }).get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            customThreadPool.shutdown();
        }
    }

    private static void process(Integer number) {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  1. Parallel Streams বড় ডেটাসেট প্রক্রিয়াকরণের জন্য কার্যকর এবং মাল্টি-কোর প্রসেসর ব্যবহার করে পারফরম্যান্স উন্নত করে।
  2. ব্যবহারের সতর্কতা: সাইড এফেক্ট এবং ছোট ডেটাসেটের জন্য এটি সাবধানে ব্যবহার করা উচিত।
  3. কাস্টম থ্রেড পুল: আরও নিয়ন্ত্রণের জন্য কাস্টম থ্রেড পুল ব্যবহার করা যায়।

এই পদ্ধতি সঠিকভাবে ব্যবহার করলে ডেটা প্রসেসিং অনেক বেশি কার্যকর এবং দ্রুত করা সম্ভব।

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

Are you sure to start over?

Loading...