2016-05-06 5 views
7

unsafe क्षेत्र में जाने के बिना, "बड़ी" फ़ाइलों (जो टेक्स्ट या बाइनरी हो सकता है) पढ़ने का सबसे प्रभावी सामान्य उद्देश्य तरीका क्या है? मैं आश्चर्यचकित था कि जब मैंने "वेब में भाग को बड़ी फाइल पढ़ने के लिए" वेब खोज की थी तो कितने प्रासंगिक परिणाम थे।भाग में बड़ी फ़ाइल पढ़ने के लिए सबसे प्रभावी तरीका

उदाहरण के लिए, अपने प्रयोग के मामलों में से एक rust-crypto का उपयोग कर एक फ़ाइल के लिए एक MD5 चेकसम गणना करने के लिए है (Md5 मॉड्यूल आपको &[u8] हिस्सा iteratively जोड़ सकते हैं)।

const CAP: usize = 1024 * 128; 
let mut file = try!(File::open("my.file")); 
let mut reader = BufReader::with_capacity(CAP, file); 

loop { 
    let length = { 
     let buffer = try!(reader.fill_buf()); 
     // do stuff with buffer here 
     buffer.len() 
    }; 
    if length == 0 { break; } 
    reader.consume(length); 
} 

उत्तर

6

मुझे नहीं लगता कि आप कोड है कि तुलना में अधिक कुशल लिख सकते है:

यहाँ मैं क्या है, जो read_to_end जैसे कुछ अन्य तरीकों की तुलना में थोड़ा बेहतर प्रदर्शन करने के लिए लगता है। fill_buf पर File पर मूल रूप से केवल read(2) पर एक सीधी कॉल है। https://github.com/rust-lang/rust/blob/e1195c24bb567019d7cdc65bf5a4c642e38475d1/src/libstd/io/buffered.rs#L185 देखें।

उस ने कहा, जब आप इसका उपयोग करते हैं तो BufReader वास्तव में एक उपयोगी अमूर्त नहीं है; यह शायद file.read(&mut buf) पर कॉल करने के लिए शायद कम अजीब होगा।

+0

उत्तर के लिए धन्यवाद! मैंने सोचा कि 'BufReader' मेरे लिए उपयोगी था क्योंकि जब मैंने पाठक के अंत तक पहुंचा तो मेरे लिए बफर का आकार बदल गया, लेकिन मुझे अभी एहसास हुआ कि यह बहुत छोटा है ... –

+2

* क्योंकि यह बफर का आकार बदल गया * - मुझे संदेह है कि यह बफर का आकार बदलता है, लेकिन स्लाइस को संभवतः बाइट्स पढ़ने की संख्या को प्रतिबिंबित करने के लिए छोटा कर दिया जाता है। लेकिन आप सही हैं कि 'रीड :: रीड' का रिटर्न वैल्यू आपको बताता है कि बफर कितना मान्य है। इसका उपयोग करने के लिए ** बहुत महत्वपूर्ण ** है, अन्यथा आप हार्टबलेड जैसी समस्या में आ सकते हैं जहां पुरानी सामग्री के साथ एक बफर का पुन: उपयोग किया जाता है! यह 'BufReader' का उपयोग करने का एक अच्छा कारण हो सकता है। – Shepmaster

+0

क्षमा करें, आप सही हैं, मेरा मतलब है "बफर की लंबाई कम करें"। –

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