2012-01-17 7 views
13

मेरे पास RAID 2 (4 x 7.2k @ 3TB) सिस्टम पर केवल 2TB पढ़ने के लिए (केवल एक बार लिखा नहीं गया) फ़ाइलें हैं।2TB फ़ाइल से फ़ाइल ऑफ़सेट द्वारा यादृच्छिक रूप से कई 300 बाइट्स टुकड़ों को पढ़ने का सबसे तेज़ तरीका?

अब मेरे पास कुछ थ्रेड हैं जो उस फ़ाइल के भाग पढ़ना चाहते हैं। प्रत्येक थ्रेड में इसकी जरूरतों के एक सरणी होती है। प्रत्येक खंड को फ़ाइल ऑफसेट (स्थिति) और आकार (लगभग 300 बाइट्स) से पढ़ने के लिए संबोधित किया जाता है।

इस डेटा को पढ़ने का सबसे तेज़ तरीका क्या है। मुझे सीपीयू चक्रों की परवाह नहीं है, (डिस्क) विलंबता क्या मायने रखती है। तो यदि संभव हो तो मैं हार्ड डिस्क के एनसीक्यू का लाभ लेना चाहता हूं।

चूंकि फाइलें अत्यधिक संकुचित होती हैं और यादृच्छिक रूप से एक्सेस की जाती हैं और मुझे बिल्कुल स्थिति पता है, मेरे पास इसे अनुकूलित करने का कोई और तरीका नहीं है।

  • क्या मुझे फ़ाइल को एक थ्रेड पर पढ़ना चाहिए?
  • क्या मुझे फ़ाइल को खोलना चाहिए?
  • प्रत्येक थ्रेड (शायद लगभग 30) प्रत्येक फाइल को एक साथ खोलना चाहिए, नए थ्रेड के साथ क्या है (वेब ​​सर्वर से)?
  • अगर मैं 100ms इंतजार करता हूं और फ़ाइल रीसेट्स (सबसे पहले सबसे पहले) द्वारा अपने रीडिंग को सॉर्ट करता हूं तो क्या इससे मदद मिलेगी?

डेटा पढ़ने का सबसे अच्छा तरीका क्या है? क्या आपके पास अनुभव, टिप्स, संकेत हैं?

उत्तर

4

समानांतर अनुरोधों की इष्टतम संख्या आपके ऐप के बाहर कारकों पर निर्भर करती है (जैसे डिस्क गणना = 4, एनसीक्यू गहराई = ?, चालक कतार गहराई =? ...), तो हो सकता है कि आप एक सिस्टम का उपयोग करना चाहें, जो कि अनुकूलित या अनुकूलित किया जा सकता है।मेरे सिफारिश है:

  • लिखें कुछ मेटाडेटा कि का अनुरोध धागा
  • एन धागे है सूचित करने के लिए अनुमति देता है के साथ एक कतार में आपके सभी पढ़ने अनुरोध एक साथ कि कतार से विपंक्ति, तुल्यकालिक हिस्सा पढ़ा है, का अनुरोध धागा सूचित
  • मेक एन क्रम-अस्थिर
  • चूंकि सीपीयू आपकी चिंता का विषय नहीं है, अपने कार्यकर्ता धागे एक अस्थायी विलंबता औसत की गणना कर सकते हैं (और/या अधिकतम, अपनी आवश्यकताओं के आधार पर)
  • स्लाइड एन ऊपर और नीचे, जब तक आप हिट मीठा बिंदु

क्यों सिंक पढ़ता है? Ascync पढ़ने से उनके पास कम विलंबता है। कतार पर विलंबता बर्बाद क्यों करें? एक अच्छा लॉकसेल कतार कार्यान्वयन की तुलना में कम 10ns विलंबता पर शुरू होता है, बहुत कम से कम दो धागा स्विच

अद्यतन: कुछ क्यू/ए

पढ़ने धागे फ़ाइलों खुला रखना चाहिए? हां, निश्चित रूप से ऐसा।

क्या आप FileOptions.RandomAccess के साथ फ़ाइलस्ट्रीम का उपयोग करेंगे? हां

आप "सिंक्रनाइज़ रूप से खंड को पढ़ते हैं" लिखते हैं। क्या इसका मतलब यह है कि प्रत्येक सिंगल रीड थ्रेड को डिस्क से एक खंड पढ़ने शुरू करना चाहिए जैसे ही यह एक खंड पढ़ने के लिए आदेश देता है? हां, यही मेरा मतलब था। पढ़ने के अनुरोधों की कतार गहराई थ्रेड गिनती द्वारा प्रबंधित की जाती है।

+0

क्या पढ़े धागे फाइलों को खुले रखना चाहिए? मैं सोचता हूँ हा। क्या आप FileOptions.RandomAccess के साथ एक फ़ाइलस्ट्रीम का उपयोग करेंगे? आप "सिंक्रनाइज़ रूप से खंड को पढ़ते हैं" लिखते हैं। क्या इसका मतलब यह है कि प्रत्येक सिंगल रीड थ्रेड को डिस्क से एक खंड पढ़ने शुरू करना चाहिए जैसे ही यह एक खंड पढ़ने के लिए आदेश देता है? – Chris

+0

आपकी टिप्पणी का जवाब देने का प्रयास कर मेरा जवाब संपादित किया। –

+0

मैं भूल गया, आपने लिखा: "अच्छा लॉकलेस कतार कार्यान्वयन 10ns से कम विलंबता से शुरू होता है"। क्या आपके पास एक विशेष कक्षा/परियोजना है? – Chris

0

डिस्क "सिंगल थ्रेडेड" हैं क्योंकि केवल एक ही सिर है। इससे कोई फर्क नहीं पड़ता कि आप कितने धागे का उपयोग करते हैं ... वास्तव में अधिक धागे शायद चीजों को धीमा कर देंगे। बस स्वयं को सूची प्राप्त करें और ऐप में इसे व्यवस्थित करें (क्रमबद्ध करें)।

आप निश्चित रूप से एनसीक्यू का उपयोग करने वाले कई धागे का उपयोग कर सकते हैं जो संभवतः अधिक कुशल हैं, लेकिन ऐप में इसे व्यवस्थित करना और एक थ्रेड का उपयोग करना बेहतर काम करना चाहिए।

अगर फ़ाइल खंडित है - एनसीक्यू और कुछ धागे का उपयोग करें क्योंकि आप डिस्क पर सटीक स्थिति नहीं जान सकते हैं, इसलिए केवल एनसीक्यू पढ़ने को अनुकूलित कर सकता है। अगर यह संगत है - सॉर्टिंग का उपयोग करें।

आप ओएस कैशिंग को बाईपास करने के लिए प्रत्यक्ष I/O भी आज़मा सकते हैं और पूरी फ़ाइल को अनुक्रमिक रूप से पढ़ सकते हैं ... कभी-कभी तेज़ हो सकता है, खासकर यदि आपके पास इस सरणी पर कोई अन्य लोड नहीं है।

+0

-1 आंशिक रूप से। यदि आप एकाधिक thjreads ahve, बहु आवश्यकता डिस्क डिस्क मारा। अच्छी डिस्क (एसएएस, एसएटीए) डिस्क को उन्हें अधिक कुशल ("मूल कमान क्यूइंग") के रूप में पुन: प्रस्तुत करने की अनुमति देती है और परिणाम को एनोथर ऑर्डर प्रदान करती है। यह आपको सामान्य सिंक एकल थ्रेडेड आईओ की तुलना में एक महत्वपूर्ण बढ़ावा देता है। – TomTom

+0

इसके अतिरिक्त मैंने RAID 5 है। इसलिए प्रत्येक डिस्क किसी अन्य स्थिति से पढ़ सकती है। – Chris

+0

इसके अतिरिक्त reuqested भाग काफी छोटे हैं, इसलिए RAID5 के साथ और अधिकांश नियंत्रक एक बार में एक पूर्ण पट्टी पढ़ रहे हैं, संभावना है, एक और खंड पहले से ही रैम में है। –

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