সম্ভব হলে আমার সর্বদা একটি সমান্তরাল প্রবাহ ব্যবহার করা উচিত?


514

জাভা 8 এবং ল্যাম্বডাস দিয়ে স্ট্রিম হিসাবে সংগ্রহের মাধ্যমে পুনরাবৃত্তি করা সহজ এবং সমান্তরাল স্ট্রিম ব্যবহার করা ঠিক তত সহজ। ডক্স থেকে দুটি উদাহরণ , দ্বিতীয়টি সমান্তরাল স্ট্রিম ব্যবহার করে:

myShapesCollection.stream()
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

myShapesCollection.parallelStream() // <-- This one uses parallel
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

যতক্ষণ না আমি অর্ডারটির বিষয়ে চিন্তা করি না, প্যারালালটি ব্যবহার করা কি সর্বদা সুবিধাজনক হবে? কেউ ভাবেন এটি আরও কোরগুলিতে কাজটি আরও দ্রুত ভাগ করছে।

অন্যান্য বিবেচনা আছে? সমান্তরাল স্ট্রিম কখন ব্যবহার করা উচিত এবং কখন অ সমান্তরাল ব্যবহার করা উচিত?

(এই প্রশ্নটি সমান্তরাল স্ট্রিমগুলি কীভাবে এবং কখন ব্যবহার করতে হবে সে সম্পর্কে একটি আলোচনার সূত্রপাত করতে বলা হয়, কারণ আমি মনে করি না যে এগুলি সর্বদা ব্যবহার করা ভাল ধারণা))

উত্তর:


735

একটি সমান্তরাল স্ট্রিমের একটি অনুক্রমের সাথে তুলনা করে অনেক বেশি ওভারহেড থাকে। থ্রেডগুলি সমন্বয় করতে একটি উল্লেখযোগ্য পরিমাণ সময় নেয়। আমি ডিফল্ট অনুসারে ক্রমিক ধারাগুলি ব্যবহার করব এবং কেবল যদি সমান্তরালগুলি বিবেচনা করি

  • প্রক্রিয়া করার জন্য আমার কাছে প্রচুর পরিমাণে আইটেম রয়েছে (বা প্রতিটি আইটেমের প্রসেসিংয়ে সময় লাগে এবং সমান্তরাল হয়)

  • আমার প্রথম পারফরম্যান্স সমস্যা আছে

  • আমি ইতিমধ্যে একটি মাল্টি-থ্রেড পরিবেশে প্রক্রিয়াটি চালাচ্ছি না (উদাহরণস্বরূপ: ওয়েব ধারক ক্ষেত্রে, যদি ইতিমধ্যে আমার সমান্তরালে প্রক্রিয়া করার জন্য অনেক অনুরোধ থাকে তবে প্রতিটি অনুরোধের অভ্যন্তরে সমান্তরালতার একটি অতিরিক্ত স্তর যুক্ত করা ইতিবাচক প্রভাবের চেয়ে বেশি নেতিবাচক হতে পারে) )

আপনার উদাহরণে, পারফরম্যান্স যেভাবেই হোক এর সিঙ্ক্রোনাইজড অ্যাক্সেস দ্বারা চালিত হবে System.out.println()এবং এই প্রক্রিয়াটিকে সমান্তরাল করে তোলার কোনও প্রভাব পড়বে না, এমনকি একটি নেতিবাচকও।

তদুপরি, মনে রাখবেন যে সমান্তরাল স্ট্রিমগুলি সমস্ত সিঙ্ক্রোনাইজেশন সমস্যাগুলিকে যাদুকরীভাবে সমাধান করে না। যদি কোনও ভাগ করা সংস্থান প্রক্রিয়াটিতে ব্যবহৃত পূর্বাভাস এবং ফাংশন ব্যবহার করা হয়, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সবকিছু থ্রেড-নিরাপদ। বিশেষত, পার্শ্ব প্রতিক্রিয়াগুলি এমন জিনিস যা আপনাকে সমান্তরালে চলে গেলে আপনার অবশ্যই চিন্তিত হতে হবে।

যে কোনও ক্ষেত্রে, পরিমাপ, অনুমান করবেন না! প্যারালালিজমের মূল্য আছে কি না তা কেবলমাত্র একটি পরিমাপ আপনাকে জানাবে।


18
ভাল উত্তর. আমি যুক্ত করব যে আপনার যদি প্রক্রিয়া করার জন্য প্রচুর পরিমাণে আইটেম থাকে তবে এটি কেবল থ্রেড সমন্বয় সম্পর্কিত সমস্যাগুলি বাড়িয়ে তোলে; এটি কেবলমাত্র যখন প্রতিটি আইটেমের প্রক্রিয়াকরণে সময় লাগে এবং এটি সমান্তরাল হয় যে সমান্তরালিতা কার্যকর হতে পারে।
ওয়ারেন ডিউ

16
@ ওয়ারেনডিউ আমি একমত নই কাঁটাচামচ / যোগদানের সিস্টেমটি সহজেই এন আইটেমগুলিকে বিভক্ত করবে, উদাহরণস্বরূপ, 4 টি অংশ এবং ক্রমান্বয়ে এই 4 অংশগুলি প্রক্রিয়া করবে। এরপরে 4 টি ফলাফল কমবে। যদি সত্যিই বিশাল হয় তবে দ্রুত ইউনিট প্রক্রিয়াকরণের জন্যও সমান্তরালকরণ কার্যকর হতে পারে। তবে সর্বদা হিসাবে, আপনি পরিমাপ করতে হবে।
জেবি নিজত

আমার কাছে এমন বস্তুর সংকলন রয়েছে যা প্রয়োগ Runnableকরে আমি start()তাদের হিসাবে Threadsএটি ব্যবহার করার জন্য কল করি , এটি কি জাভা 8 টি স্ট্রিমিকে .forEach()সমান্তরালে ব্যবহার করে পরিবর্তন করা ঠিক হবে ? তারপরে আমি ক্লাসের বাইরে থ্রেড কোডটি ফেলাতে সক্ষম হব। তবে কি কোন ডাউনসাইড আছে?
ycomp

1
@ জেবিনিজেট যদি ৪ টি অংশ ক্রমানুসারে প্রসারণ করে তবে এর প্রক্রিয়া সমান্তরাল বা ক্রমিকভাবে হওয়া কোন পার্থক্য নেই? Pls স্পষ্ট করুন
হর্ষানা

3
@ হর্ষণ তাঁর স্পষ্টতই বোঝাতে চেয়েছেন যে চারটি অংশের প্রতিটি উপাদান ক্রমান্বয়ে প্রক্রিয়া করা হবে। যাইহোক, অংশগুলি নিজেরাই একযোগে প্রক্রিয়া করা হতে পারে। অন্য কথায়, আপনার কাছে বেশ কয়েকটি সিপিইউ কোর উপলব্ধ থাকলে, প্রতিটি অংশ ক্রমান্বয়ে নিজস্ব উপাদানগুলি প্রক্রিয়া করার সময়, অন্য অংশগুলির থেকে স্বতন্ত্রভাবে তার নিজস্ব কোর এ চালাতে পারে। (দ্রষ্টব্য: আমি জানি না, যদি এটি জাভা সমান্তরালভাবে কীভাবে কাজ করে তবে আমি জেবিনিজেট বলতে কী বোঝাতে চাইছি তা পরিষ্কার করার চেষ্টা করছি।)
আগামীকাল

258

ধারাবাহিক এবং সমান্তরালগুলির মধ্যে স্যুইচিং সহজ করে, কীভাবে এগুলি কার্যকর করা হবে তা থেকে দূরে সরানো কোনও উপায়ে গণনা লিখতে সহজ করার জন্য স্ট্রিম এপিআই তৈরি করা হয়েছিল।

যাইহোক, কেবল কারণ এটি সহজ, এর অর্থ এটি সর্বদা একটি ভাল ধারণা নয় এবং আসলে, এটি কেবল বাদ দেওয়া খারাপ ধারণা is.parallel() কেবলমাত্র আপনি পারার কারণে এটি পুরো জায়গায় ।

প্রথমত, দ্রষ্টব্য যে সমান্তরালতা যখন আরও বেশি কোর পাওয়া যায় তখন দ্রুত সম্পাদনের সম্ভাবনা ব্যতীত অন্য কোনও সুবিধা দেয় না। একটি সমান্তরাল সম্পাদন সবসময়ই অনুক্রমের চেয়ে আরও বেশি কাজ জড়িত কারণ সমস্যা সমাধানের পাশাপাশি এটি উপ-কার্যগুলি প্রেরণ ও সমন্বয় সম্পাদন করতে হবে। আশা করা যায় যে আপনি একাধিক প্রসেসরের জুড়ে কাজটি দ্রুত ছড়িয়ে দিয়ে উত্তরটি পেতে সক্ষম হবেন; এটি আসলে ঘটে কিনা আপনার ডেটা সেটের আকার সহ আপনি প্রতিটি উপাদানগুলিতে কতটা গণনা করছেন, গণনার প্রকৃতি সহ বিশেষত অনেকগুলি বিষয়ের উপর নির্ভর করে (বিশেষত, কোনও উপাদানটির প্রক্রিয়াজাতকরণ অন্যের প্রক্রিয়াজাতকরণের সাথে ইন্টারেক্ট করে?) , উপলব্ধ প্রসেসরের সংখ্যা এবং process প্রসেসরের জন্য প্রতিযোগিতামূলক অন্যান্য কাজের সংখ্যা।

আরও উল্লেখ করুন যে সমান্তরালতাও প্রায়শই অনুমিতি প্রয়োগের দ্বারা লুকানো সংখ্যায় ননডেটেরিনিজমকে প্রকাশ করে; কখনও কখনও এটি গুরুত্বপূর্ণ নয়, বা জড়িত অপারেশনগুলিকে সীমাবদ্ধ করে প্রশমিত করা যেতে পারে (অর্থাত্ হ্রাস অপারেটরগুলি অবশ্যই রাষ্ট্রহীন এবং সাহসী হতে হবে।)

বাস্তবে, কখনও কখনও সমান্তরালতা আপনার গণনার গতি বাড়িয়ে তুলবে, কখনও কখনও এটি করবে না, এবং কখনও কখনও এটি এমনকি এটি ধীর করে দেয়। প্রথমে সিক্যুয়াল এক্সিকিউশন ব্যবহার করে বিকাশ করা এবং তারপরে যেখানে সমান্তরালতা প্রয়োগ করা ভাল

(ক) আপনি জানেন যে কার্যকারিতা বাড়িয়ে তোলা আসলেই সুবিধা

(খ) এটি আসলে বর্ধিত পারফরম্যান্স সরবরাহ করবে।

(ক) একটি ব্যবসায়িক সমস্যা, কোনও প্রযুক্তিগত সমস্যা নয়। আপনি যদি কোনও পারফরম্যান্স বিশেষজ্ঞ হন তবে আপনি সাধারণত কোডটি দেখতে এবং (বি) নির্ধারণ করতে সক্ষম হবেন তবে স্মার্ট পাথটি পরিমাপ করা। (এবং, আপনি (এ) সম্পর্কে নিশ্চিত হওয়া অবধি বিরক্তও করবেন না; কোডটি যদি দ্রুততর হয় তবে অন্য কোথাও আপনার মস্তিষ্কের চক্র প্রয়োগ করা ভাল))

সমান্তরালতার জন্য সবচেয়ে সহজ পারফরম্যান্স মডেল হ'ল "এনকিউ" মডেল, যেখানে এন উপাদানগুলির সংখ্যা এবং Q উপাদান হিসাবে প্রতি গুণন হয়। সাধারণভাবে, আপনি পারফরম্যান্স সুবিধা পেতে শুরু করার আগে আপনার পণ্যটি এনকিউ কিছুটা থ্রেশহোল্ড অতিক্রম করতে হবে। "1 থেকে N পর্যন্ত সংখ্যা যোগ করুন" এর মতো নিম্ন-কিউ সমস্যার জন্য, আপনি সাধারণত এন = 1000 এবং এন = 10000 এর মধ্যে একটি ব্রেক ব্রেক দেখতে পাবেন। উচ্চ-কিউ সমস্যাগুলির সাথে, আপনি নিম্ন প্রান্তে ব্রেক ব্রেকগুলি দেখতে পাবেন।

তবে বাস্তবতা বেশ জটিল। সুতরাং যতক্ষণ না আপনি পরীক্ষা-নিরীক্ষা অর্জন করেন, প্রথমে শনাক্তকরণ প্রক্রিয়াকরণ কখন আপনার জন্য কিছু ব্যয় করে তা সনাক্ত করুন এবং তারপরে প্যারালালিজম সাহায্য করবে কিনা তা পরিমাপ করুন।


18
এই পোস্টটি এনকিউ মডেল সম্পর্কে আরও বিশদ দেয়: gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html
পিনো

4
@specializt: সমান্তরাল করার অনুক্রমিক থেকে একটি স্ট্রিম সুইচিং করে আলগোরিদিম (অধিকাংশ ক্ষেত্রে) পরিবর্তন করুন। এখানে বর্ণিত নির্ধারণটি আপনার (স্বেচ্ছাসেবক) অপারেটরগুলির উপর নির্ভর করতে পারে এমন বৈশিষ্ট্য সম্পর্কিত ( স্ট্রিম বাস্তবায়ন এটি জানতে পারে না) তবে অবশ্যই নির্ভর করা উচিত নয় । এই উত্তরের বিভাগটি এটাই বলতে চেয়েছিল। আপনি যদি নিয়মগুলি সম্পর্কে যত্নশীল হন তবে আপনি যেমন বলছেন ঠিক তেমনই আপনি একটি বিবাদী ফলাফলও পেতে পারেন (অন্যথায় সমান্তরাল প্রবাহগুলি বেশ অযথা ছিল) তবে এর findAnyপরিবর্তে ব্যবহার করার সময় যেমন ইচ্ছাকৃতভাবে অ-নির্ধারণবাদকে অনুমোদিত হওয়ার সম্ভাবনাও রয়েছে findFirst
হোলার

4
"প্রথমে লক্ষ করুন যে সমান্তরালতা যখন আরও বেশি কোর পাওয়া যায় তখন দ্রুত মৃত্যুদণ্ড কার্যকর হওয়ার সম্ভাবনা ব্যতীত অন্য কোনও সুবিধা দেয় না" - বা আপনি যদি আইও (যেমন myListOfURLs.stream().map((url) -> downloadPage(url))...) এর সাথে জড়িত কোনও ক্রিয়া প্রয়োগ করেন তবে ।
জুলে

6
@ পেসারিয়র এটি একটি দুর্দান্ত তত্ত্ব, তবে দুঃখের সাথে নিষ্পাপ (একটি শুরু করার জন্য অটো-প্যারালালাইজাইজিং সংকলক তৈরির প্রয়াসের ৩০ বছরের ইতিহাস দেখুন)। যেহেতু আমরা অনিবার্যভাবে এটি ভুল হয়ে যায় তখন ব্যবহারকারীকে বিরক্ত না করার জন্য যথাযথ অনুমান করা যথাযথ নয়, তাই দায়বদ্ধ কাজটি কেবল ব্যবহারকারীকে কী চান তা বলতে দেওয়া। বেশিরভাগ পরিস্থিতিতে ডিফল্ট (অনুক্রমিক) সঠিক এবং আরও অনুমানযোগ্য।
ব্রায়ান গয়েটজ

2
@ জুলস: আইও এর জন্য কখনই সমান্তরাল স্ট্রিম ব্যবহার করবেন না। এগুলি কেবলমাত্র সিপিইউ নিবিড় ক্রিয়াকলাপের জন্য। সমান্তরাল স্ট্রিমগুলি ব্যবহার করে ForkJoinPool.commonPool()এবং আপনি সেখানে ব্লকিংয়ের কাজগুলি যেতে চান না।
সি 2

68

আমি এক প্রেক্ষিত উপস্থাপনা এর ব্রায়ান Goetz (জন্য ল্যামডা প্রকাশ জাভা ভাষা স্থপতি & স্পেসিফিকেশন সীসা) । তিনি সমান্তরালে যাওয়ার আগে বিবেচনা করার জন্য নিম্নলিখিত 4 টি বিষয়গুলি বিস্তারিতভাবে ব্যাখ্যা করেছেন:

বিভাজন / পচনশীল ব্যয়
- কখনও কখনও কেবল কাজটি করার চেয়ে বিভাজন আরও ব্যয়বহুল!
টাস্ক প্রেরণ / পরিচালনার ব্যয়
- কাজটি অন্য থ্রেডে হাতে দেওয়ার সময় অনেক কাজ করতে পারে।
ফলাফল সমন্বয় ব্যয়
- কখনও কখনও সংমিশ্রণে প্রচুর ডেটা অনুলিপি করা হয়। উদাহরণস্বরূপ, সংখ্যা যুক্ত করা সস্তা যেখানে মেশানো সেট ব্যয়বহুল।
লোকালয়
- ঘরে হাতি। এটি একটি গুরুত্বপূর্ণ বিষয় যা প্রত্যাহার করতে পারে। আপনার ক্যাশে মিস করা বিবেচনা করা উচিত, যদি কোনও সিপিইউ ক্যাশে মিস করার কারণে ডেটার জন্য অপেক্ষা করে তবে আপনি সমান্তরালে কোনও কিছুই অর্জন করতে পারবেন না। এই কারণেই অ্যারে-ভিত্তিক উত্সগুলি পরবর্তী সূচকগুলি (বর্তমান সূচকের নিকটে) ক্যাশেড হওয়ার কারণে সর্বোত্তমভাবে সমান্তরাল হয় এবং সিপিইউতে ক্যাশে মিস হওয়ার সম্ভাবনা কম থাকে।

সমান্তরাল গতিবেগের সুযোগ নির্ধারণের জন্য তিনি একটি তুলনামূলক সহজ সূত্রেরও উল্লেখ করেছেন।

এনকিউ মডেল :

N x Q > 10000

যেখানে,
এন = তথ্য আইটেমের সংখ্যা
Q = আইটেম প্রতি কাজের পরিমাণ


13

জেবি মাথায় পেরেক মারল। কেবলমাত্র আমি যুক্ত করতে পারি জাভা 8 খাঁটি সমান্তরাল প্রক্রিয়াকরণ করে না, এটি প্যারাওকেন্সিবল করে । হ্যাঁ আমি নিবন্ধটি লিখেছি এবং আমি ত্রিশ বছর ধরে এফ / জে করছি তাই আমি বিষয়টি বুঝতে পারি না।


10
স্ট্রিমগুলি পুনরাবৃত্তিযোগ্য নয় কারণ স্ট্রিমগুলি বাহ্যরের পরিবর্তে অভ্যন্তরীণ পুনরাবৃত্তি করে। সে যাইহোক স্ট্রিমগুলির পুরো কারণ। যদি আপনার একাডেমিক কাজের সাথে সমস্যা হয় তবে ক্রিয়ামূলক প্রোগ্রামিং আপনার জন্য নাও হতে পারে। কার্যকরী প্রোগ্রামিং === গণিত === একাডেমিক। এবং না, জে 8-এফজেটি ভাঙ্গা নয়, এটি বেশিরভাগ লোকেরা চ ****** ম্যানুয়ালটি পড়ে না। জাভা ডক্স খুব পরিষ্কার বলেছে যে এটি কোনও সমান্তরাল সম্পাদন কাঠামো নয়। সমস্ত বিভাজন স্টাফ জন্য পুরো কারণ। হ্যাঁ এটি একাডেমিক, হ্যাঁ এটি কীভাবে এটি ব্যবহার করতে জানেন তা যদি কাজ করে। হ্যাঁ, কাস্টম এক্সিকিউটার ব্যবহার করা আরও সহজ হওয়া উচিত
Kr0e

1
স্ট্রিমটিতে একটি পুনরুক্তি () পদ্ধতি রয়েছে, তাই আপনি চাইলে আপনি এগুলি বাহ্যিক পুনরাবৃত্তি করতে পারেন। আমার বোধগম্যতা হল তারা এট্রেটেবল প্রয়োগ করে না কারণ আপনি কেবল একবার পুনরাবৃত্তি ব্যবহার করতে পারবেন এবং কেউ ঠিক আছে কিনা তা সিদ্ধান্ত নিতে পারে না।
ট্রেজকাজ

14
সত্যি কথা বলতে: আপনার পুরো কাগজটি একটি বিশাল, বিস্তৃত রেন্টের মতো পড়ে - এবং এটি তার বিশ্বাসযোগ্যতাটিকে তুচ্ছ করে দেয় ... আমি এটিকে অনেক কম আক্রমণাত্মক আন্ডারটোন দিয়ে পুনরায় কাজ করার পরামর্শ দিই অন্যথায় অনেকেই এটি সম্পূর্ণরূপে পড়তে বিরক্ত করবেন না ... আমি কেবল সায়ান
বিশেষ

আপনার নিবন্ধ সম্পর্কে কয়েকটি প্রশ্ন ... প্রথমত, আপনি কেন নির্দেশিত অ্যাসাইক্লিক গ্রাফের সাথে সুস্পষ্ট গাছের কাঠামোগুলিকে সমতুল্য করেন? হ্যাঁ, সুষম গাছ হয় লিঙ্ক তালিকা এবং প্রায় কাছাকাছি যে অবজেক্ট ওরিয়েন্টেড ডাটা স্ট্রাকচার অ্যারে ছাড়া অন্য DAGs, কিন্তু। এছাড়াও, যখন আপনি বলছেন যে পুনরাবৃত্তিশীল পচন কেবলমাত্র ভারসাম্য গাছের কাঠামোর উপর কাজ করে এবং তাই এটি বাণিজ্যিকভাবে প্রাসঙ্গিক নয়, আপনি কীভাবে এই দৃser়তার সমর্থন করবেন? এটা যে এটা কাজ করা উচিত (সত্যিই গভীরতা বিষয়টি পরীক্ষা করার ছাড়া বোঝা যাচ্ছে যে নেতারা) আমার মনে হচ্ছে ঠিক যেমন ভাল অ্যারে-ভিত্তিক datastructures, যেমন উপর ArrayList/ HashMap
জুলে

1
এই থ্রেডটি ২০১৩ সালের, তার পর থেকে অনেক কিছু পরিবর্তন হয়েছে। এই বিভাগটি বিস্তারিত উত্তর নয় মন্তব্যগুলির জন্য।
14-15 এ স্বাক্ষরিত

3

সমান্তরাল প্রক্রিয়াকরণে অকাল অপটিমাইজেশন এবং ওভারহেড ব্যয় এড়াতে অন্যান্য উত্তর ইতিমধ্যে প্রোফাইলিং coveredেকে রেখেছে। এই উত্তরটি সমান্তরাল স্ট্রিমিংয়ের জন্য ডেটা স্ট্রাকচারের আদর্শ পছন্দ ব্যাখ্যা করে।

একটি নিয়ম হিসাবে, উপমা থেকে কার্য সম্পাদনে লাভ বেশি স্ট্রিমগুলিতে সবচেয়ে ভাল হয় ArrayList, HashMap, HashSet, এবং ConcurrentHashMapদৃষ্টান্ত; অ্যারে; intরেঞ্জ; এবং longব্যাপ্তি। এই ডেটা স্ট্রাকচারগুলির মধ্যে যা মিল রয়েছে তা হ'ল এগুলি সমস্ত সঠিক ও সস্তাভাবে যে কোনও পছন্দসই আকারের সাবরেঞ্জগুলিতে বিভক্ত হতে পারে, যা সমান্তরাল থ্রেডগুলির মধ্যে কাজকে বিভক্ত করা সহজ করে তোলে। এই কাজটি সম্পাদনের জন্য স্ট্রিম লাইব্রেরি দ্বারা ব্যবহৃত বিমূর্ততাটি স্প্লিট্রেটর, যা spliteratorপদ্ধতিতে Streamএবং দ্বারা ফিরে আসে Iterable

এই সমস্ত ডেটা স্ট্রাকচারের মধ্যে একটি মিল রয়েছে এমন আরও একটি গুরুত্বপূর্ণ বিষয় হ'ল ধারাবাহিকভাবে প্রক্রিয়া করার সময় তারা যথাযথ-থেকে-রেফারেন্সের স্থানীয় লোকেশন সরবরাহ করে: ক্রমিক উপাদানগুলির রেফারেন্সগুলি মেমরিতে একসাথে সংরক্ষণ করা হয়। এই রেফারেন্স দ্বারা উল্লেখ করা বস্তুগুলি মেমরির ক্ষেত্রে একে অপরের কাছাকাছি নাও থাকতে পারে, যা লোকাল-অফ-রেফারেন্স হ্রাস করে। লোকাল-অফ-রেফারেন্স বাল্ক অপারেশনগুলিকে সমান্তরাল করার জন্য সমালোচনামূলকভাবে গুরুত্বপূর্ণ বলে প্রমাণিত হয়: এটি ছাড়াই থ্রেডগুলি প্রসেসরের ক্যাশে মেমরি থেকে ডেটা স্থানান্তরিত হওয়ার অপেক্ষায় তাদের বেশিরভাগ সময় অলসভাবে ব্যয় করে। উল্লেখের সর্বোত্তম এলাকা সহ ডেটা স্ট্রাকচারগুলি আদিম অ্যারে হয় কারণ ডেটা নিজেই স্মৃতিতে স্বচ্ছন্দভাবে সংরক্ষণ করা হয়।

উত্স: আইটেম # 48 স্ট্রিভগুলি সমান্তরাল করার সময় সাবধানতা অবলম্বন করুন, জোশুয়া ব্লচ দ্বারা কার্যকর জাভা 3 ই


2

অসীম প্রবাহকে কখনই সীমাবদ্ধ করে তুলবেন না। যা ঘটে তা এখানে:

    public static void main(String[] args) {
        // let's count to 1 in parallel
        System.out.println(
            IntStream.iterate(0, i -> i + 1)
                .parallel()
                .skip(1)
                .findFirst()
                .getAsInt());
    }

ফলাফল

    Exception in thread "main" java.lang.OutOfMemoryError
        at ...
        at java.base/java.util.stream.IntPipeline.findFirst(IntPipeline.java:528)
        at InfiniteTest.main(InfiniteTest.java:24)
    Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.stream.SpinedBuffer$OfInt.newArray(SpinedBuffer.java:750)
        at ...

আপনি যদি একই ব্যবহার করেন .limit(...)

এখানে ব্যাখ্যা: জাভা 8, একটি প্রবাহে। সমান্তরাল ব্যবহার OOM ত্রুটির কারণ করে

একইভাবে, যদি স্ট্রিমটি অর্ডার করা হয় এবং আপনার প্রক্রিয়া করার চেয়ে অনেক বেশি উপাদান থাকে তবে সমান্তরাল ব্যবহার করবেন না, যেমন

public static void main(String[] args) {
    // let's count to 1 in parallel
    System.out.println(
            IntStream.range(1, 1000_000_000)
                    .parallel()
                    .skip(100)
                    .findFirst()
                    .getAsInt());
}

এটি অনেক বেশি সময় ধরে চলতে পারে কারণ সমান্তরাল থ্রেডগুলি গুরুত্বপূর্ণ এক 0-100 এর পরিবর্তে প্রচুর সংখ্যা রেঞ্জের উপর কাজ করতে পারে যার ফলে এটি খুব দীর্ঘ সময় নেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.