मान लीजिए मैं एक डाटासेट 1e12 32-बिट ints (4 टीबी) एक 4tb HDD ext4 फाइलसिस्टम पर एक फ़ाइल में संग्रहीत की एक सरणी है कि ..लिनक्स: बड़े int सरणी: mmap बनाम फ़ाइल खोजना?
पर विचार करें कि डेटा सबसे अधिक संभावना यादृच्छिक है (या कम से कम लगता है यादृच्छिक)।
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
इसके अलावा, विचार है कि मैं एक अप्रत्याशित क्रम में और कलन विधि अनिश्चित काल चलाता है (यह चालू है) कि व्यक्ति पूर्णांक तत्वों को पढ़ने के लिए चाहते हैं।
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
हम लिनक्स x86_64, gcc पर हैं। आप सिस्टम मान सकते हैं रैम 4 जीबी है (यानी 1000x कम डाटासेट से)
निम्नलिखित वास्तुकार का उपयोग करने के दो तरीके होते हैं:
(ए) स्मृति का एक 4 टीबी ब्लॉक करने के लिए फ़ाइल mmap, और एक के रूप में यह पहुँच int array
(बी) फ़ाइल खोलें और 2 (2) का उपयोग करें और इन्हें पढ़ने के लिए (2) पढ़ें।
ए और बी के बाहर बेहतर प्रदर्शन होगा ?, और क्यों?
क्या कोई अन्य डिज़ाइन है जो या तो ए या बी से बेहतर प्रदर्शन करेगा?
रैम तक पहुंचने की गति एचडी तक पहुंचने के लिए गति से अधिक है (परिमाण के कुछ क्रम के, यांत्रिक भागों की अनुपस्थिति के कारण)। अगर आपको स्मृति की समस्या नहीं है, तो रैम में सभी फाइलों का मानचित्रण करना आपके लिए सबसे अच्छा समाधान है। आप ठोस-राज्य ड्राइव (जो रैम के समान हैं) पर भी विचार कर सकते हैं। इसके अलावा, अगर यादृच्छिक पहुंच का मतलब वास्तव में यादृच्छिक पहुंच है, तो आप कुछ प्रदर्शनों को बेहतर बनाने के लिए कैश को अक्षम कर सकते हैं (यानी, यदि एक ही तत्व तक पहुंचने की संभावना बहुत कम है, तो कैश में खोजना उपयोगी नहीं है)। –
@ डी। कैनोन कैश को किसी अन्य उद्देश्य के लिए रखते हुए यादृच्छिक-पहुंच करना केवल बिलकुल है, धन्यवाद! – Benoit
# सी इसे नेटवर्क से कुछ प्रकार के कर्नेल बाईपास तकनीक (लोडिंग आरडीएमए पर infiniband) से लोड कर रहा है। यह ए और बी – bobah