2011-12-09 23 views
7

पर बड़े पैमाने पर लिखने का अनुकूलन मेरे पास एक सी ऐप (VStudio 2010, win7 64bit) दोहरी ज़ीऑन चिप्स वाली मशीन पर चल रहा है, जिसका अर्थ है 12 भौतिक और 24 लॉजिकल कोर, और 1 9 2 गीगा रैम। संपादित करें: ओएस win7 है (यानी, विंडोज 7, 64 बिट)।डिस्क

ऐप में 24 धागे हैं (प्रत्येक धागे का अपना तार्किक कोर है) गणना कर रहा है और एक विशाल सी संरचना का एक अलग हिस्सा भर रहा है। संरचना, जब सभी धागे समाप्त हो जाते हैं (और धागे पूरी तरह से संतुलित होते हैं तो वे एक ही समय में पूरा होते हैं), लगभग 60 गीगाबाइट है।

(मेरे पास हार्डवेयर सेटअप पर नियंत्रण है, इसलिए मैं RAID 0 चलाने वाले 6 2tb ड्राइव का उपयोग करने जा रहा हूं, जिसका अर्थ है कि लेखन पर भौतिक सीमा औसत अनुक्रमिक लेखन गति लगभग 6x होगी, या लगभग 2 गीगा/सेकेंड ।)

डिस्क पर पहुंचने का सबसे प्रभावी तरीका क्या है? जाहिर है, आई/ओ समय गणना समय बौना होगा। इस विषय पर मेरे शोध से, ऐसा लगता है जैसे लिखना() (fwrite() के विपरीत) जाने का तरीका है। लेकिन बफर आकार आदि के मामले में सॉफ्टवेयर साइड पर मैं अन्य अनुकूलन क्या कर सकता हूं, क्या एमएमएपी अधिक कुशल होगा?

+0

कृपया उस भाषा को जोड़ें जिसमें आप किस भाषा में लिखना चाहते हैं। इससे दूसरों को यह प्रश्न आसानी से ढूंढने में मदद मिलती है। – Buddha

+0

गणना कब तक लेती है? –

+0

मुझे एक 'mmap' टैग दिखाई देता है। क्या यह आपके सिस्टम के लिए उपलब्ध है? –

उत्तर

6

आपकी स्थिति के लिए सबसे अच्छी चीज का न्याय करना मुश्किल है।

फ़ाइल को प्रीलोकेट करने का पहला अनुकूलन है। इस तरह आपकी फाइल सिस्टम को इसके आकार को विस्तारित करने की आवश्यकता नहीं है। यह कुछ डिस्क संचालन को अनुकूलित करना चाहिए। हालांकि, डिस्क पर वास्तविक शून्य लिखने से बचें। बस लंबाई निर्धारित करें।

फिर आपके पास mmap और लिखने के बीच विकल्प हैं। यह आपके द्वारा उपयोग की जाने वाली ऑपरेटिंग सिस्टम पर भी निर्भर करता है। यूनिक्स पर मैं एमएमएपी और पिरिट दोनों की कोशिश करता हूं। pwrite उपयोगी है क्योंकि आपके प्रत्येक थ्रेड फ़ाइल ऑफसेट पर लड़ने के बिना वांछित फ़ाइल स्थिति में फ़ाइल में लिख सकते हैं।

mmap अच्छा हो सकता है क्योंकि फ़ाइल कैश में प्रतिलिपि बनाने के बजाय, आपके थ्रेड सीधे फ़ाइल कैश में लिखेंगे। 60 जीबी पूरी फाइल को एमएमएपी करने के लिए शायद बहुत बड़ी है, इसलिए प्रत्येक थ्रेड को अपनी खुद की एमएमएपी विंडो की फाइल पर उस फाइल पर इसकी आवश्यकता होगी जो इसे चारों ओर ले जा सके।

विंडोज़ में आप शायद ओवरलैप्ड, एसिंक्रोनस आईओ का उपयोग करने का प्रयास करना चाहते हैं। यह केवल Win32 API कॉल के साथ किया जा सकता है।

+1

विंडोज़ में एमएमएपी (CreateFileMapping, MapViewOfFile) के बराबर है, और यह ज़ैन सूचीबद्ध के कारणों के लिए अच्छा होने की संभावना है। –

+1

और इसी कारण से (यह ओएस का उपयोग करता है) मैप की गई फ़ाइलें विंडोज़ पर भी अच्छे प्रदर्शन हैं। इसके अलावा विंडोज़ नेटवर्क ड्राइव पर एक फाइल मैप कर सकते हैं। यूनिक्स ने एनएफएस पर एमएमएपी करने में सक्षम नहीं किया - क्या यह बदल गया है? –

8

mmap(), या boost mmap लगभग हमेशा सबसे अच्छा तरीका है। ओएस आपके से ज्यादा चालाक है, चिंता करें कि कैश करना है!

आपने ओएस नहीं कहा, लेकिन लिनक्स पर madvise, या समकक्ष बूस्ट संकेत वास्तव में प्रदर्शन को बढ़ावा दे सकते हैं।

+1

+1, हमेशा, हमेशा किसी और को जितना संभव हो उतना विवरण पसीना दें! –

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