2015-11-08 5 views
6

मुझे एक फ़ोल्डर में सभी फ़ाइलों पर दोबारा पढ़ने के लिए केवल कुछ पढ़ने की आवश्यकता है। मैं फाइलों की स्ट्रीम प्राप्त करने के लिए Files.walk का उपयोग कर रहा हूं, लेकिन मैंने देखा कि एपीआई निर्दिष्ट करता है कि walk केवल एक नियमित स्ट्रीम देता है, समानांतर स्ट्रीम नहीं।मैं फ़ाइलों की समानांतर स्ट्रीम कैसे प्राप्त कर सकता हूं। वॉल्क?

मैं निर्देशिका में सभी फ़ाइलों को समानांतर में कैसे संसाधित कर सकता हूं?

+4

शायद 'Files.walk (...)। समानांतर() 'जैसी कुछ हो सकती है? – Flown

+0

@ फ्लाउन हा ... मुझे मूर्खतापूर्ण। यह नहीं पता था कि आप सामान्य धाराओं को समानांतर में परिवर्तित कर सकते हैं। –

उत्तर

15

आप का उपयोग करके Stream को समांतर Stream में बदल सकते हैं।

Stream<Path> stream = Files.walk(startPath).parallel().forEach(...); 
+9

ध्यान दें कि 'Files.walk' खराब रूप से समानांतर है, खासकर यदि आपके उपट्री में 1024 से कम फ़ाइलें हैं। यदि आपके पास बहुत अधिक फाइल प्रसंस्करण है और इतनी सारी फाइलें नहीं हैं, तो यह संभवतः 'Files.walk (पथ) .collect (toList()) के लिए अधिक कुशल होगी। समानांतरस्ट्रीम() '। –

+1

@TagirValeev दिलचस्प। क्या आपके पास एक लिंक है जो समझा रहा है कि ऐसा क्यों है? –

+7

@ डेविड ग्रीनबर्ग, जेडीके स्रोत कोड और बेंचमार्क। यह आंतरिक रूप से 'Spliterators.spliterator अज्ञात आकार 'का उपयोग करता है जो विभाजन तत्वों को 1024 तत्वों से शुरू होने वाले सरणी में भाग लोड करना है। जैसा कि आकार अज्ञात है, स्ट्रीम पाइपलाइन इंजन मानता है कि विभाजन भी भागों को उत्पन्न करता है, लेकिन वे वास्तव में नहीं हैं (पहले <= 1024 इनपुट के लिए विभाजित सभी तत्व प्रत्यय में सभी तत्वों को छोड़कर प्रत्यय में कोई तत्व छोड़ते हैं)। इसका परिणाम बहुत खराब समानांतर प्रदर्शन में होता है। –

संबंधित मुद्दे

 संबंधित मुद्दे