AtomicInteger recordNumber = new AtomicInteger();
Files.lines(inputFile.toPath(), StandardCharsets.UTF_8)
.map(record -> new Record(recordNumber.incrementAndGet(), record))
.parallel()
.filter(record -> doSomeOperation())
.findFirst()
আমি যখন এটি লিখেছিলাম তখন আমি ধরে নিয়েছিলাম যে থ্রেডগুলি কেবলমাত্র মানচিত্রের কল তৈরি হবে কারণ মানচিত্রের পরে সমান্তরাল স্থাপন করা হয়েছে placed তবে ফাইলের কয়েকটি লাইন প্রতিটি সম্পাদনের জন্য বিভিন্ন রেকর্ড নম্বর পেয়েছিল।
হুডের নীচে স্ট্রিমগুলি কীভাবে কাজ করে তা বুঝতে আমি সরকারী জাভা স্ট্রিম ডকুমেন্টেশন এবং কয়েকটি ওয়েব সাইট পড়েছি ।
কিছু প্রশ্ন:
জাভা সমান্তরাল স্ট্রিমটি স্প্লিটটাইটারের উপর ভিত্তি করে কাজ করে , যা প্রতিটি সংগ্রহ যেমন অ্যারেলিস্ট, লিংকডলিস্ট ইত্যাদির দ্বারা প্রয়োগ করা হয় When যখন আমরা এই সংগ্রহগুলির মধ্যে একটি সমান্তরাল স্ট্রিম নির্মাণ করি, তখন সংশ্লিষ্ট বিভক্ত পুনরুক্তিটি সংগ্রহটি বিভক্ত ও পুনরাবৃত্ত করতে ব্যবহৃত হবে। এটি ব্যাখ্যা করে যে ম্যাপের ফলাফলের পরিবর্তে মূল ইনপুট উত্স (ফাইল লাইন) স্তরে কেন সমান্তরালতা ঘটেছিল (যেমন রেকর্ড পোজো)। আমার বোধগম্যতা কি সঠিক?
আমার ক্ষেত্রে, ইনপুটটি একটি ফাইল আইও স্ট্রিম। কোন বিভাজন পুনরুক্তি ব্যবহার করা হবে?
আমরা
parallel()
পাইপলাইনে কোথায় রাখি তা বিবেচ্য নয়। আসল ইনপুট উত্সটি সর্বদা বিভক্ত হবে এবং বাকি মধ্যবর্তী ক্রিয়াকলাপগুলি প্রয়োগ করা হবে।এই ক্ষেত্রে জাভা ব্যবহারকারীদের মূল উত্স ব্যতীত পাইপলাইনে কোথাও সমান্তরাল অপারেশন করার অনুমতি দেয় না। কারণ, এটি জাভা স্ট্রিম অভ্যন্তরীণভাবে কীভাবে কাজ করে তা জানেন না তাদের জন্য এটি ভুল ধারণা দিচ্ছে। আমি জানি
parallel()
অপারেশনটি স্ট্রিম অবজেক্ট টাইপের জন্য সংজ্ঞায়িত করা হত এবং সুতরাং এটি এভাবে কাজ করছে is তবে, কিছু বিকল্প সমাধান সরবরাহ করা ভাল।উপরের কোড স্নিপেটে, আমি ইনপুট ফাইলের প্রতিটি রেকর্ডে একটি লাইন নম্বর যুক্ত করার চেষ্টা করছি এবং তাই এটির আদেশ দেওয়া উচিত। তবে আমি
doSomeOperation()
ভারী ওজনের যুক্তি হওয়ায় সমান্তরালে প্রয়োগ করতে চাই । অর্জনের এক উপায় হ'ল আমার নিজস্ব কাস্টমাইজড স্প্লিট পুনরায় পাঠক। অন্য কোন উপায আছে কি?
Stream
সরাসরি ইন্টারফেসে দেওয়া হয় এবং প্রতিটি ক্রিয়াকলাপের কারণে প্রতিটি ক্রিয়াকলাপ Stream
আবার ফিরে আসে। কল্পনা করুন যে কেউ আপনাকে একটি দিতে চায় Stream
তবে ইতিমধ্যে map
এটির মতো বেশ কয়েকটি অপারেশন প্রয়োগ করেছে। আপনি, একজন ব্যবহারকারী হিসাবে, এখনও এটি সিদ্ধান্ত নিতে সক্ষম করতে চান যে এটি সমান্তরালভাবে কার্যকর করা হবে কিনা। সুতরাং আপনার পক্ষে parallel()
এখনও কল করা সম্ভব হবে , যদিও স্ট্রিমটি ইতিমধ্যে বিদ্যমান।
flatMap
যদি আপনি থ্রেড-অনিরাপদ পদ্ধতি বা অনুরূপ কার্যকর করেন।
Path
স্থানীয় ফাইল সিস্টেমে রয়েছে এবং আপনি একটি সাম্প্রতিক জেডিকে ব্যবহার করছেন, স্প্লিটেটরেটারে 1024 এর গুণমানের তুলনায় আরও ভাল সমান্তরাল প্রক্রিয়াকরণ ক্ষমতা থাকবে But তবে ভারসাম্যপূর্ণ বিভাজন কিছু findFirst
পরিস্থিতিতে দৃ counter়ভাবে উত্পাদনশীলও হতে পারে …
parallel()
অন্তর্নিহিত স্ট্রিম অবজেক্টে প্রয়োগ করা একটি সাধারণ সংশোধক অনুরোধ ছাড়া আর কিছুই নয়। মনে রাখবেন যে কেবলমাত্র উত্স-স্ট্রিম যদি আপনি পাইপে চূড়ান্ত ক্রিয়াকলাপ প্রয়োগ না করেন, তবে যতক্ষণ না কোনও কিছুই "কার্যকর" হয় না। এই বলে, আপনি মূলত জাভা ডিজাইনের পছন্দগুলি নিয়ে প্রশ্ন করছেন। কোনটি মতামত ভিত্তিক এবং আমরা এটিতে সত্যই সহায়তা করতে পারি না।