2012-12-30 16 views
5

मैं वर्तमान में सी फ़ाइल के संचालन (शायद एक प्रकार का डीबीएमएस) पर बी + पेड़ बनाम सामान्य-संतुलित-पेड़ के लिए प्रदर्शन परीक्षण कर रहा हूं। सी बी + पेड़ बीबीटी से तेज होने की उम्मीद है क्योंकि यह कम डिस्क करता है आई/ओ संचालन। लेकिन मैंने पाया कि, कुछ परीक्षणों के बाद, सिस्टम डिस्क फ़ाइलों के लिए कैशिंग कर रहा है, फ़ाइल पूरी तरह से स्मृति में सहेजा गया था (मेरी मेमोरी आकार 32 जीबी है)! बी + पेड़ बीबीटी से तेज नहीं हो सकता है क्योंकि कोई डिस्क I/O नहीं किया जाएगा। तो मुझे आश्चर्य है कि सिस्टम कैशिंग को अक्षम करने का कोई तरीका है ताकि बी + पेड़ पेर्फ में जीत सके? मैं खुले साथ O_DIRECT फ़ाइल की कोशिश की है | O_SYNC:डिस्क फ़ाइलों के लिए सिस्टम (यूनिक्स) कैशिंग अक्षम करने का कोई तरीका है?

int fd = Open("sb.dat", O_DIRECT|O_SYNC|O_CREAT|O_RDWR, S_IRWXU|S_IRWXG|S_IRWXO); 

लेकिन यह काम नहीं लगता है। 1359821

पेज दोष: 9

+0

आप कैश के साथ तुलना क्यों करना चाहेंगे। वास्तविक जीवन में आप यही चाहते हैं। यदि आप देखना चाहते हैं कि यह अधिक कार्यों या अधिक मेमोरी लोड के साथ कैसे कार्य करता है, तो कुछ समांतर बेंचमार्क चलाएं, या एक "memmuncher" एप्लिकेशन लिखें जो आवंटित करता है और फिर उस मेमोरी तक पहुंचता है (लूप में - सुनिश्चित करें कि आपके पास अभी भी पर्याप्त CPU क्षमता है सिस्टम चलाने के लिए)। –

+0

'O_SYNC' के बारे में क्या? – BAK

+0

O_DIRECT | O_SYNC | O_CREAT | O_RDWR अभी भी काम नहीं करता है :( –

उत्तर

2

AFAIK गिरी डिस्क से अभी भी कैश ब्लॉक भी जब आप O_DIRECT का उपयोग करेगा, आप

यहाँ() getrusage द्वारा प्रदान की कुछ जानकारी

पेज reclaims है कर्नेल कैश छोड़ सकता है लेकिन यह केवल पहली बार काम करता है:

echo 3 > /proc/sys/vm/drop_caches 
+0

लेकिन मैं कई ब्लॉकों पर कई बार जाएं ..... –

+0

@ClannChen आप इसे प्रत्येक I/O से पहले कॉल कर सकते हैं – iabdalkader