2013-04-08 5 views
6

मैं एक रेल 6 प्लेटफॉर्म पर डिस्क प्रदर्शन का एक सरल परीक्षण चलाने के लिए चाहता हूं। यह सिर्फ डिस्क पर 1 जी बाइट लिखना है। मैंने पाया कि फ़ाइल पहले अनलिंक की गई थी, तो इसे छोटा कर दिया गया था जितना तेज़ होगा। यह लगभग 1.5 बनाम 15s बनाम था।fwrite() तेज़ी से है अगर फ़ाइल को छिड़कने से पहले फ़ाइल में

क्यों? मैंने सोचा कि अनलिंक() आखिरी हार्ड लिंक फ़ाइल को 0 पर छोटा कर देगा और इनोड को हटा देगा। क्यों trwrites truncate से अनलिंक() के साथ तेजी से थे?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int 
main(int argc, char* argv[]) 
{ 
    if (argc < 2) { 
     return -1; 
    } 

    char buf[1024]; 

    srand(time(0)); 

    int i; 
    for (i = 0; i < 1024; ++i) { 
     buf[i] = rand(); 
    } 

    /* unlink(argv[1]); */ 
    FILE* fp = fopen(argv[1], "wb+"); 
    if (fp == NULL) { 
     perror("fopen"); 
     return -1; 
    } 

    for (i = 0; i < 1024 * 1024; ++i) { 
     if (fwrite(buf, 1024, 1, fp) != 1) { 
      perror("fwrite"); 
      return -1; 
     } 
    } 

    return 0; 
} 

उत्तर

5

आप डिस्क और फाइल सिस्टम पर पर्याप्त खाली स्थान फ़ाइलों को हटाने और lazily अपने अंतरिक्ष को पुनः प्राप्त कर सकते हैं जब एक फ़ाइल को हटाने से यह छोटा तुलना में तेजी दिखाई दे सकते हैं। यह केवल इनोड को हटाए जाने के रूप में चिह्नित कर सकता है और पृष्ठभूमि में फ़ाइल को बाद में या बाद में हटा सकता है और नए लिखने के लिए लगभग तुरंत एक नया इनोड बना सकता है।

+0

एलेक्सी, आपके उत्तर के लिए धन्यवाद। मुझे इस बारे में एक ही विचार था हालांकि मुझे यकीन नहीं है। लेकिन फिर भी मुझे समझ में नहीं आता कि इस तरह का कटाव क्यों लागू नहीं किया जाता है। यदि फ़ाइल को शून्य पर छोटा कर दिया गया है, तो क्यों न छंटनी वाले ब्लॉक को एक नए इनोड में ले जाएं और वर्तमान इनोड को अगले लिखने के लिए साफ रखें? – Zhongzhi

+0

मुझे निश्चित रूप से पता नहीं है। वास्तव में, आपके प्रश्न का उत्तर फ़ाइल सिस्टम के कार्यान्वयन पर निर्भर करता है। आप इसे और अधिक शोध करना चाहते हैं, फ़ाइल सिस्टम दस्तावेज़ या स्रोत कोड देखें और वेब पर प्रदर्शन चर्चाएं देखें। –

+1

@ झोंगज़ी "क्यों न किए गए ब्लॉक को एक नए इनोड में नहीं ले जाएं" - नया नया इनोड क्या है? सिस्टम के बाकी हिस्सों के खर्च पर अपने कार्यक्रम को तेजी से बनाने के लिए एक इनोड आवंटित करना एक लुभावनी विचार और एफएस कोड की एक व्यर्थ जटिलता है। यह इस तथ्य से काफी अलग है कि फाइल के आखिरी लिंक को हटाने पर पुनर्विचार को हटाने के लिए शुल्क नहीं लिया जाता है क्योंकि ब्लॉक को असीमित रूप से पुनः प्राप्त किया जाता है। –

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