मैं उच्च थ्रूपुट C++ सर्वर में उपयोग के लिए सर्वोत्तम डेटा संरचना के साथ आने का प्रयास कर रहा हूं। डेटा संरचना का उपयोग कुछ से कुछ मिलियन ऑब्जेक्ट्स से कुछ भी स्टोर करने के लिए किया जाएगा, और कोई सॉर्टिंग आवश्यक नहीं है (हालांकि एक अद्वितीय सॉर्ट कुंजी बहुत सस्ता प्रदान की जा सकती है)।समवर्ती डेटा संरचना डिजाइन
आवश्यकताएं हैं कि यह कुशल डालने, आदर्श ओ (1), मामूली कुशल हटाने और कुशल ट्रैवर्सल का समर्थन कर सकती है। इसे एक खोज ऑपरेशन का समर्थन करने की आवश्यकता नहीं है (हटाने के लिए आवश्यक हो सकता है)।
मोड़ यह है कि यह संशोधनों के संबंध में धागा सुरक्षित होना चाहिए जबकि अन्य थ्रेड डेटा संरचना की गणना कर रहे हैं। इसका मतलब यह है कि एक साधारण लाल-काला पेड़ काम नहीं करता है, क्योंकि एक थ्रेड किसी अन्य कर्सर द्वारा आयोजित किसी भी कर्सर को गड़बड़ किए बिना तत्व (और आवश्यक पेड़ घूर्णन निष्पादित करता है) नहीं डाल सकता है।
यह पढ़ने/लिखने के लॉक का उपयोग करने के लिए स्वीकार्य नहीं है और सभी पाठकों को समाप्त होने तक लिखने के संचालन को स्थगित कर देता है, क्योंकि पढ़ने के संचालन लंबे समय तक जीवित रह सकते हैं। इससे कोई फर्क नहीं पड़ता कि पाठक होने पर आवेषण उस पाठक के लिए दृश्यमान होते हैं या नहीं।
मेमोरी पदचिह्न भी बहुत महत्वपूर्ण है, और छोटा स्पष्ट रूप से बेहतर है!
क्या सुझाव हैं?
टिप्पणी करने के लिए उत्तर:
जवाब के लिए धन्यवाद।
नहीं, आवेषण मौजूदा इटरेटर्स को अमान्य नहीं कर सकता है। इटरेटर नए सम्मिलन को देख सकते हैं या नहीं देख सकते हैं, लेकिन अगर वे सम्मिलित नहीं हुए थे तो उन्हें सब कुछ देखना होगा।
हटाना आवश्यक है, हालांकि उच्च स्तर के नियमों के कारण मैं गारंटी दे सकता हूं कि एक पुनरावर्तक किसी आइटम पर कभी नहीं रोका जाएगा जो हटाने के लिए उपलब्ध है।
एक कर्सर के लिए प्रति नोड लॉकिंग प्रदर्शन पर बहुत अधिक प्रभाव डालेगा। एक बार में कई धागे पढ़ रहे हैं, और किसी भी प्रकार की मेमोरी हॉट स्पॉट जो लॉक में कई थ्रेड का उपयोग कर रही है, मेमोरी बैंडविड्थ को मारता है (जैसा कि हमने कड़ी मेहनत की खोज की है!)। InterlockedIncrement को कॉल करने वाले एकाधिक थ्रेड वाले पाठकों की एक साधारण गणना भी स्केल करने में विफल रहता है।
मैं सहमत हूं कि एक लिंक्ड सूची शायद सबसे अच्छा तरीका है। Deletes दुर्लभ हैं, तो ओ (1) हटाने का समर्थन करने के लिए बैक पॉइंटर्स के लिए मेमोरी जुर्माना का भुगतान महंगा है और हम मांग पर अलग से गणना कर सकते हैं और चूंकि हटाए गए बैच ऑपरेशंस होते हैं।
सौभाग्य से एक लिंक्ड सूची में सम्मिलन को पाठकों के लिए किसी भी लॉकिंग की आवश्यकता नहीं होती है, जब तक कि पॉइंटर को पॉइंटर बदलने से पहले डाले गए नोड में अपडेट किया जाता है।
लॉक-कॉपी-अनलॉक विचार दिलचस्प है। पाठकों के लिए डिफ़ॉल्ट के रूप में काम करने के लिए इसमें शामिल डेटा की मात्रा बहुत बड़ी है, लेकिन पाठकों के साथ टकराव करते समय लेखकों के लिए इसका उपयोग किया जा सकता है। एक पठन/लिखने वाला ताला पूरी संरचना की रक्षा करेगा, और यदि पाठक के साथ टकरा जाता है तो लेखन डेटा संरचना को क्लोन कर देगा। लेखन पढ़ने से बहुत दुर्लभ हैं।
क्या मौजूदा इटरेटर को अमान्य कर सकते हैं? यदि ऐसा है, तो यह जीवन को आसान बनाता है। क्या आप हटाने का समर्थन करना चाहते हैं? यदि हां, तो अपेक्षित व्यवहार क्या होता है जब एक थ्रेड किसी आइटम को हटा देता है जिसे दूसरे द्वारा पढ़ा जा रहा है? –
आपका लक्ष्य क्या है? लॉक-फ्री या प्रतीक्षा-मुक्त डेटा संरचना? – user