2016-12-21 9 views
6

मेरे पास निम्नलिखित चुनौती है:बहु-संसाधन वातावरण में फ़ाइलों को पढ़ने का सबसे तेज़ तरीका? सी #

मेरे पास कई उदाहरणों के साथ एक Azure क्लाउड वर्कर भूमिका है। हर मिनट, प्रत्येक उदाहरण लगभग 20-30 धागे फैलता है। प्रत्येक थ्रेड में, इसे 3 ऑब्जेक्ट्स से थ्रेड को संसाधित करने के तरीके के बारे में कुछ मेटाडेटा पढ़ने की आवश्यकता होती है। वस्तुओं/डेटा रिमोट RavenDb में रहते हैं और भले ही RavenDb HTTP के माध्यम से ऑब्जेक्ट्स को पुनर्प्राप्त करने में बहुत तेज़ है, फिर भी यह 30+ श्रमिकों से काफी भार में है जो प्रति मिनट प्रति थ्रेड 3 बार मार रहे हैं (लगभग 45 अनुरोध/सेकंड)। अधिकांश समय (जैसे 99.9 99%) रावेनडीबी में डेटा नहीं बदलता है।

मैंने स्थानीय स्टोरेज कैशिंग को लागू करने का निर्णय लिया है। सबसे पहले, मैंने एक छोटा रिकॉर्ड पढ़ा जो इंगित करता है कि मेटाडेटा बदल गया है (यह बहुत ही कम हो जाता है), और फिर स्थानीय स्टोरेज में ऑब्जेक्ट कैश किया गया है, तो मैं RavenDb के बजाय स्थानीय फ़ाइल संग्रहण से पढ़ता हूं। मैं File.ReadAllText()

का उपयोग कर रहा हूं यह दृष्टिकोण मशीन को नीचे घुमा रहा है और प्रोसेसिंग काफी धीमा हो रहा है। मैं "छोटे" वर्कर भूमिकाओं पर डिस्क अनुमान लगा रहा हूं पर्याप्त तेज़ नहीं हैं।

क्या वैसे भी है, क्या मैं ओएस को मेरी मदद कर सकता हूं और उन फ़ाइलों को कैश कर सकता हूं? शायद इस डेटा को कैशिंग करने का विकल्प है?

मैं आकार में 100k से 10 एमबी से लेकर आकार बदलती के बारे में ~ 1000 फाइलों प्रत्येक बादल भूमिका उदाहरण

+0

शायद 'स्ट्रीमरडर' और स्ट्रीम का उपयोग करके स्मृति में प्रति कार्यकर्ता के सभी 10 एमबी टेक्स्ट डालने की बजाय लाइनों को पढ़ने के लिए? इस पर एक स्वीकार्य समाधान देखने के लिए इंतजार नहीं कर सकता! – TyCobb

+0

धन्यवाद .. लेकिन मुझे "लाइनों" को एक JSON तारों में कनवर्ट करने की आवश्यकता है जिसे मुझे C# ऑब्जेक्ट में कनवर्ट करने की आवश्यकता है। सुनिश्चित नहीं है कि StreamReader इसे हल करने जा रहा है, अगर मुझे फ़ाइल को – Igorek

+0

में फ़ाइल की आवश्यकता है तो शायद नहीं, तो यदि आप लाइन =/ – TyCobb

उत्तर

5

नहीं एक सीधा जवाब पर संग्रहीत को देख रही है, लेकिन तीन संभावित विकल्प:

का प्रयोग करें अंतर्निहित RavenDB कैशिंग तंत्र

मेरा प्रारंभिक अनुमान यह है कि आपकी कैशिंग तंत्र वास्तव में प्रदर्शन को नुकसान पहुंचा रहा है। RavenDB क्लाइंट में अंतर्निहित कैशिंग है (इसे देखने के लिए यहां देखें: https://ravendb.net/docs/article-page/3.5/csharp/client-api/how-to/setup-aggressive-caching)

आपके पास समस्या यह है कि कैश प्रत्येक सर्वर के लिए स्थानीय है। यदि सर्वर ए ने पहले एक फ़ाइल डाउनलोड की है, तो सर्वर बी को अगली बार उस फ़ाइल को संसाधित करने के लिए अभी भी इसे प्राप्त करना होगा।

एक संभावित विकल्प जिसे आप कार्यान्वित कर सकते हैं वह वर्कलोड को विभाजित करता है। उदाहरण के लिए:

  • सर्वर एक => फ़ाइलों को ई के साथ शुरू
  • सर्वर बी लाने => फ़ाइलें कि एह के साथ शुरू
  • सर्वर सी => ... लाने

यह होगा सुनिश्चित करें कि आप प्रत्येक सर्वर पर कैश अनुकूलित करें।

  • डिस्क पहुँच
  • की Deserialization:

    एक बड़ा मशीन

    आप अभी भी अपने स्वयं के कैशिंग तंत्र को रोजगार चाहते हैं जाओ, वहाँ दो चीजें हैं जो मैं टोंटी हो सकता है की कल्पना कर रहे हैं JSON

इन मुद्दों के लिए, केवल एक चीज जिसे मैं कल्पना कर सकता हूं वह बड़ा res usces:

  • यदि यह डिस्क है, तो एसएसडी के साथ प्रीमियम स्टोरेज का उपयोग करें।
  • यदि यह अक्रमांकन है, वी एम के

कैश फ़ाइलों रैम

में वैकल्पिक रूप से, मिल एक बड़ा सीपीयू के साथ बजाय डिस्क के लिए फ़ाइलों को लिखने के लिए उन्हें स्मृति में स्टोर और अधिक रैम के साथ एक वी एम मिल । आपको उस रैम की आवश्यकता नहीं होनी चाहिए, क्योंकि 1000 फाइलें * 10 एमबी अभी भी 1 जीबी है। ऐसा करने से डिस्क एक्सेस और deserialization खत्म हो जाएगा।

लेकिन आखिरकार, सबसे पहले यह मापना सबसे अच्छा है कि बाधा कहां है और देखें कि इसे रावेनडीबी के अंतर्निर्मित कैशिंग तंत्र का उपयोग करके कम किया जा सकता है या नहीं।

+0

यह बहुत दिलचस्प है! मैं क्लाइंट को परिवर्तनों की सदस्यता कैसे दूं और बदली गई वस्तुओं के लिए स्वचालित रूप से कैश को अमान्य कर दूं? मैंने Ravendb साइट पर उदाहरण देखे हैं जो इंगित करता है कि मैं परिवर्तनों की सदस्यता ले सकता हूं, लेकिन यह नहीं दिखा रहा कि आक्रामक कैश को खुद को अमान्य कैसे बनाया जाए – Igorek

+0

आपको किसी भी बदलाव की सदस्यता लेने या कैश को अमान्य करने की आवश्यकता नहीं है। जब आप कोई अनुरोध करते हैं, तो RavenDB सर्वर 304 के साथ जवाब देगा - संशोधित स्थिति कोड नहीं है और RavenDB क्लाइंट को आपको कैश किए गए संस्करण को वापस देना चाहिए। जैसे ही कोई दस्तावेज़ बदलता है, रावेनडीबी 200 बार फिर से लौटाएगा। – Kenneth

+0

भी आक्रामक कैशिंग के लिए? – Igorek

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