c# - How to re-order data in memory to optimize cache access? -


मैं एक बड़ा डेटासेट (प्रकार list & lt; record & gt; ) को घसीटना चाहता हूं, फिर पुनरावृत्त करना यह कई बार आमतौर पर, एक सूची को फेरबदल करने से संदर्भों में बदलाव होता है, न कि डेटा। मेरे एल्गोरिदम का प्रदर्शन बहुत ही तेजी से (3x) भुगतना पड़ता है क्योंकि अक्सर कैश लापता होता है। मैं शफ़ल डेटा की गहरी प्रतिलिपि बनाने के लिए इसे कैश मैत्रीपूर्ण बनाने के लिए कर सकता हूं। हालांकि, यह मेमोरी उपयोग को दोगुना कर देगा।

क्या डेटा फेरबदल या फिर से ऑर्डर करने के लिए कोई और अधिक स्मृति-कुशल तरीका है, ताकि बदतर डेटा कैश मैत्रीपूर्ण हो?

विकल्प 1:

बनाओ रिकॉर्ड a struct ताकि <

तब या तो सीधे इसे सॉर्ट करें, या सीधे सूची को क्रमबद्ध करने के बजाय (यदि रिकॉर्ड बड़े होते हैं), सूचकांक की एक सरणी बनाएं () प्रारंभ में बस {0, 1, ..., n - 1} ) और फिर तुलनित्र के आधार पर सूचकांक को सॉर्ट करने वाले तत्वों की तुलना करें। आखिरकार अगर आपको सॉर्ट की गई सरणी की ज़रूरत होती है तो आप सूचकों को देखकर फेकड ऑर्डर में तत्वों की प्रतिलिपि बना सकते हैं।
नोट करें कि यह संभवतः स्ट्रैक्ट्स को छाँटने की तुलना में अधिक कैश-मैत्रीपूर्ण है, लेकिन कम से कम यह डेटा के माध्यम से एक पास होगा, इसलिए संरचना आकार के आधार पर, यह तेज़ी से होने की अधिक संभावना है। यदि संरचना बड़ी है तो आप वास्तव में इसका सामना नहीं कर सकते, इसलिए यदि आप सुनिश्चित नहीं हैं कि रिकॉर्ड बड़ा है, तो आपको दोनों तरीकों से प्रयास करना होगा और यह देखना होगा कि रिकॉर्ड को सीधे क्रमबद्ध करना अधिक कुशल है ।

यदि आप इस प्रकार को बदल नहीं सकते हैं, तो आपका एकमात्र समाधान किसी तरह उन्हें स्मृति में निकटतम बनाने के लिए है ऐसा करने का एकमात्र वास्तविक तरीका प्रारंभिक कचरा संग्रहण करना है, फिर आवंटित करें उन्हें क्रम में रखें, और अपनी उंगलियों को पार करके रखें कि रनटाइम उन्हें कॉन्सीग्यू से आवंटित करेगा अगर आप इसे किसी struct नहीं बना सकते हैं, तो मैं काम करने वाला कोई अन्य तरीका नहीं सोच सकता।
अगर आपको लगता है कि बीच में चलने वाला एक अन्य कचरा संग्रह ऑर्डर को गड़बड़ कर सकता है, तो आप कर सकते हैं इन वस्तुओं के पिन किए गए संदर्भों के साथ GCHandle का दूसरा सरणी बनाने का प्रयास करें मैं इसे सुझा नहीं है, लेकिन उस बिंदु पर यह आपका एकमात्र समाधान हो सकता है।

विकल्प 2:

क्या आप वास्तव में का उपयोग कर छंटनी के लिए पूरे रिकॉर्ड? यह संभावना नहीं है यदि नहीं, तो बस प्रत्येक रिकॉर्ड के उस भाग को निकालें जो प्रासंगिक है, उनको सॉर्ट करें और फिर मूल डेटा को फेरबदल करें।


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -