আমি নীচের জাভা প্রোগ্রামটি একটি কেন দেয় তা বোঝার চেষ্টা করছি OutOfMemoryError
, যখন সংশ্লিষ্ট প্রোগ্রামটি না .parallel()
করে দেয় without
System.out.println(Stream
.iterate(1, i -> i+1)
.parallel()
.flatMap(n -> Stream.iterate(n, i -> i+n))
.mapToInt(Integer::intValue)
.limit(100_000_000)
.sum()
);
আমার দুটি প্রশ্ন আছে:
এই প্রোগ্রামের উদ্দেশ্যে আউটপুট কি?
.parallel()
এটি ছাড়া এটি দেখে মনে হচ্ছে যে এটি কেবল আউটপুট দেয়sum(1+2+3+...)
যার অর্থ এটি ফ্ল্যাটম্যাপের প্রথম প্রবাহে কেবল "আটকে যায়", যা বোঝা যায়।সমান্তরালভাবে আমি জানি না কোনও প্রত্যাশিত আচরণ আছে কিনা, তবে আমার অনুমান যে এটি কোনওভাবেই প্রথম
n
বা এতগুলি ধারা প্রবাহিত করেছিল যেখানেn
সমান্তরাল কর্মীদের সংখ্যা রয়েছে। চুনকিং / বাফারিং আচরণের ভিত্তিতে এটি কিছুটা আলাদাও হতে পারে।স্মৃতিশক্তি শেষ হয়ে যাওয়ার কারণ কী? এই স্ট্রিমগুলি কীভাবে হুডের অধীনে প্রয়োগ করা হয় তা আমি বিশেষভাবে বুঝতে চেষ্টা করছি।
আমি অনুমান করছি যে কোনও কিছু প্রবাহকে বাধা দিচ্ছে, তাই এটি কখনই শেষ হয় না এবং উত্পন্ন মানগুলি থেকে মুক্তি পেতে সক্ষম হয় তবে আমি ঠিক জানি না কোন জিনিসগুলির ক্রম মূল্যায়ন করা হয় এবং কোথায় বাফারিং ঘটে।
সম্পাদনা: যদি এটি প্রাসঙ্গিক হয় তবে আমি জাভা 11 ব্যবহার করছি।
এডিট 2: আপাতদৃষ্টিতে একই জিনিস এমনকি সাধারণ প্রোগ্রামের ক্ষেত্রেও ঘটে IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, তাই এটির limit
চেয়ে বরং অলসতার সাথে কাজ করতে পারে flatMap
।