ठीक है, इस गति के लिए आप जिस गति को प्राप्त कर सकते हैं वह 96 केबी निकालने के लिए आपके द्वारा किए जाने वाले पढ़ने वाले कार्यों की कुल संख्या पर निर्भर करता है जो आपकी नई फ़ाइल के लिए पेलोड बनाते हैं।
ऐसा क्यों है? क्योंकि (कताई) डिस्क से यादृच्छिक पढ़ना चाहते हैं; चुंबकीय सिर को फिर से स्थापित करने के समय की तुलना में पढ़ा जाता है (लगभग) असीम रूप से तेज़।
चूंकि आप कह रहे हैं कि एक्सेस पैटर्न यादृच्छिक है, तो आपको किसी भी रीडहेड से लाभ होने की भी संभावना नहीं है कि ऑपरेटिंग सिस्टम उपयोग करने का निर्णय ले सकता है; यदि आप चुनते हैं, तो आप बड़ी फ़ाइल के लिए दायरस्क्रिप्टर पर fadvise(fd, 0, MAX_OFFSET, FADV_RANDOM);
के माध्यम से इसे बंद कर सकते हैं। या, madvise()
यदि आपने mmap()
पर चुना है। लेकिन अगर आप बड़े पढ़ रहे हैं तो आपको केवल तभी लाभ मिलेगा (और आप जानते हैं कि एक बड़ा रीडहेड बकवास होगा)। छोटे पढ़ने के लिए, यह विशेष रूप से खोज समय है जो कुल निर्धारित करेगा।
मान लिया जाये कि आप की जरूरत N
यादृच्छिक पढ़ता है और आप मिल गया है एक M
msec समय की तलाश है, यह कम से कम N * m
मिलीसेकेंड ले लेंगे डेटा निष्कर्षण प्रदर्शन करने के लिए (यदि आप अपने आप को करने के लिए डिस्क मिल गया है ...)। इस बाधा को तोड़ने का कोई रास्ता नहीं है।
संपादित करें: कम करने की रणनीतियों पर कुछ बातें:
कई लोगों ने उल्लेख किया है, कुंजी इस समस्या दृष्टिकोण को कम करने का प्रयास है। इसके लिए कई रणनीतियों रहे हैं:
- अंक अतुल्यकालिक पढ़ता है अगर तुम (अर्थात, अगर पढ़ आपरेशन
N+1
क्या आपरेशन N
पढ़ा है, तो आप दोनों साथ-साथ जारी कर सकते हैं पर निर्भर नहीं करता) कर सकते हैं। यह ऑपरेटिंग सिस्टम/डिवाइस ड्राइवर को कतारबद्ध करने की अनुमति देता है और संभावित रूप से उन्हें फिर से ऑर्डर करने की अनुमति देता है (या उन्हें अन्य समवर्ती चल रही प्रक्रियाओं द्वारा किए गए पाठों के साथ मर्ज करें)।
- यदि आप पहले से ही सभी पदों को जानते हैं, तो उसी प्रभाव के लिए स्कैटर-इकट्ठा I/O (संयुक्त राष्ट्र * एक्स
preadv()
दिमाग में आ जाएगा) प्रदर्शन करें।
- सर्वोत्तम/न्यूनतम अवरोध के लिए अपने फाइल सिस्टम और/या ब्लॉक डिवाइस को क्वेरी करें; यह कैसे करें सिस्टम-निर्भर है, उदाहरण देखें statvfs() या यहां तक कि ioctl_list। यदि आप जानते हैं, तो संभवतः आप निमो द्वारा वर्णित तकनीक का उपयोग कर सकते हैं ("इष्टतम" ब्लॉक आकार के भीतर दो छोटे पढ़ने को एक बड़े पढ़ने में मिलाएं, कोई तलाश नहीं चाहिए)।
- संभवतः भी क्वेरी इंटरफेस का उपयोग की तरह
FIEMAP
/FIBMAP
(विंडोज बराबर मोटे तौर पर FSCTL_GET_RETRIEVAL_POINTERS
होगा) निर्धारित करने के लिए जहां अपनी फ़ाइल डेटा के लिए शारीरिक ब्लॉक हैं, और पढ़ने पर कोई फैसला प्रदर्शन पर आधारित है कि विलय (वहाँ एक बड़ी जारी करने कोई मतलब नहीं है "nonseeking" पढ़ा जाता है अगर वास्तव में एक भौतिक ब्लॉक सीमा पार करता है और फाइल सिस्टम इसे दो में बदल देता है)।
- यदि आप तुलनात्मक रूप से बड़े समय से पढ़ने के लिए पदों का निर्माण करते हैं, तो पढ़ना (असीमित रूप से) जैसा कि आप अभी भी भविष्य में पढ़ने वाले ऑफसेट की गणना करते हैं, वैसे भी विलंब विलंब को छिपाने में मदद मिलेगी, क्योंकि आप गणना चक्र/अच्छे समय के लिए प्रतीक्षा कर रहे हैं उपयोग।
सामान्य रूप से, यदि उपरोक्त में से कोई भी लागू नहीं होता है, तो आपको बुलेट काटने और तलाश विलंबता स्वीकार करनी होगी। यदि आप लागत (और/या रैम की अस्थिरता) को औचित्य दे सकते हैं तो एक ठोस स्थिति डिस्क खरीदें और/या रैम-समर्थित फ़ाइल सिस्टम का उपयोग करें।
स्रोत
2011-07-11 15:58:21
मुझे संदेह है कि यह 12 जी को यादृच्छिक रूप से पढ़ने के लिए शारीरिक रूप से संभव है और उन्हें दो सेकंड में वापस लिखना संभव है। – Jacob
क्या आप अधिक जानकारी दे सकते हैं? छोटी फ़ाइल के लिए बाइट्स का पता लगाने के लिए आपको सभी 12GB स्कैन करने की आवश्यकता है। या क्या कोई एल्गोरिदम/हेडर/चेन/जो भी आपको बताता है कि वे कहां हैं? आपका धीमा 'fseek' प्रोग्राम और अधिक व्याख्या करने में मदद करेगा ... – Roddy
एक 16kb फ़ाइल के लिए 3 मिनट या पूरे 12 जीबी को 16kb भाग में विभाजित करने में मदद करेगा? –