मेरे पास MyReader
है जो Iterator
लागू करता है और Buffer
एस Buffer : Send
बनाता है। MyReader
बहुत सारे Buffer
एस बहुत तेज़ी से उत्पन्न करता है, लेकिन मेरे पास प्रत्येक Buffer
(.map(|buf| ...)
) पर प्रदर्शन करने के लिए एक सीपीयू-गहन नौकरी है जो मेरी बाधा है, और उसके बाद परिणाम (आदेश दिया गया) इकट्ठा करें। मैं सीपीयू तीव्र काम को समानांतर करना चाहता हूं - उम्मीद है कि एन थ्रेड्स के लिए, जो कोर की संख्या जितनी जल्दी हो सके उन्हें निष्पादित करने के लिए काम चोरी का उपयोग करेगा।जंग में एक कस्टम, सिंगल थ्रेडेड इटरेटर पर समानांतर रूप से 'मानचित्र (...) `कैसे करें?
संपादित करें: अधिक सटीक होने के लिए। मैं rdedup
पर काम कर रहा हूं। MyStruct
Chunker
है जो io::Read
(आमतौर पर stdio) पढ़ता है, डेटा के हिस्सों (भाग) पाता है और उन्हें उपज देता है। map()
प्रत्येक खंड के लिए, map(...)
के परिणामस्वरूप पाइस्ट को sha256 पाचन की गणना करने, संपीड़ित करने, एन्क्रिप्ट करने, सहेजने और वापस करने के लिए माना जाता है। सहेजे गए डेटा का डाइजेस्ट डेटा के index
बनाने के लिए उपयोग किया जाता है। map(...)
द्वारा संसाधित किए जाने वाले हिस्सों के बीच का आदेश कोई फर्क नहीं पड़ता है, लेकिन प्रत्येक map(...)
से लौटाया गया पाचन उसी क्रम में एकत्र किए जाने की आवश्यकता है जो भाग पाए गए थे। वास्तविक चरण save
फ़ाइल चरण में अभी तक एक और थ्रेड (writter thread) तक ऑफ़लोड किया गया है। actual code of PR in question
मुझे आशा है कि मैं इसके लिए rayon
का उपयोग कर सकता हूं, लेकिन rayon
एक पुनरावर्तक की अपेक्षा करता है जो पहले से ही लंबित है - उदाहरण के लिए। Vec<...>
या ऐसा कुछ। मुझे MyReader
से par_iter
प्राप्त करने का कोई तरीका नहीं मिला है - मेरा पाठक प्रकृति में बहुत एकल-थ्रेडेड है।
simple_parallel
है लेकिन दस्तावेज़ीकरण कहता है कि सामान्य उपयोग के लिए इसकी अनुशंसा नहीं की जाती है। और मैं यह सुनिश्चित करना चाहता हूं कि सबकुछ सिर्फ काम करेगा।
मैं सिर्फ एक स्पैम कतार कार्यान्वयन और एक कस्टम thread_pool
ले सकता था, लेकिन मैं अनुकूलित और परीक्षण किए गए मौजूदा समाधान के लिए रोक रहा था।
pipeliner
भी है लेकिन अभी तक आदेशित मानचित्र का समर्थन नहीं करता है।
हम कुछ चीजें यहाँ भूल रहे हैं? (1) क्या परिणाम की तरह (अपने कार्य stdout पर कुछ फेंकना है होना चाहिए एक फ़ाइल में लिखने लौट कुछ) और (2) निष्पादन के मामले का आदेश है या नहीं? –
यदि इटेटरेटर सामग्री का उत्पादन करने में तेज़ी से है, लेकिन उन्हें संसाधित करने में समय लगता है, तो एक उचित कामकाज तत्वों को छोटे वैक्टरों में एकत्र करना और रेयन के 'par_iter()' के साथ प्रक्रिया करना है। यह बेहतर होगा अगर रेयन ने इसे मूल रूप से समर्थन दिया, हालांकि, स्ट्रीम से आने वाली वस्तुओं की समानांतर प्रक्रिया अक्सर एक आवश्यक विशेषता है। – user4815162342
@ उपयोगकर्ता 4815162342: हम्म ... दिलचस्प है, लेकिन ऐसा लगता है कि यह थ्रेड पढ़ने पर अनावश्यक देरी करेगा, जो प्रत्येक बैच को पूरा करने के लिए होगा, और मैं वास्तव में पूर्ण CPU उपयोग की तलाश में हूं। –