2016-05-06 23 views
7

Cách thức mục đích chung hiệu quả nhất để đọc các tệp "lớn" (có thể là văn bản hoặc nhị phân), mà không đi vào lãnh thổ unsafe? Tôi đã ngạc nhiên khi có ít kết quả có liên quan khi tôi tìm kiếm trên web về "gỉ đọc tệp lớn trong các đoạn". Ví dụ: một trong các trường hợp sử dụng của tôi là tính toán tổng kiểm tra MD5 cho tệp bằng cách sử dụng rust-crypto (mô-đun Md5 cho phép bạn thêm &[u8] khối lặp lại).Cách hiệu quả nhất để đọc tệp lớn theo khối

Đây là những gì tôi có, mà dường như để thực hiện tốt hơn một chút so với một số phương pháp khác như read_to_end:

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); 
} 

Trả lời

6

Tôi không nghĩ rằng bạn có thể viết mã hiệu quả hơn đó. fill_buf trên số BufReader trên một số File về cơ bản chỉ là một cuộc gọi thẳng tới read(2). Xem https://github.com/rust-lang/rust/blob/e1195c24bb567019d7cdc65bf5a4c642e38475d1/src/libstd/io/buffered.rs#L185.

Điều đó nói rằng, BufReader không thực sự là một trừu tượng hữu ích khi bạn sử dụng nó như thế; có lẽ sẽ ít khó xử khi gọi trực tiếp số file.read(&mut buf).

+0

Cảm ơn câu trả lời! Tôi nghĩ rằng 'BufReader' rất hữu ích cho tôi vì nó đã thay đổi kích cỡ bộ đệm cho tôi khi tôi đọc đến cuối người đọc, nhưng tôi nhận ra nó khá tầm thường ... –

+2

* vì nó đã thay đổi kích thước bộ đệm * - tôi nghi ngờ rằng nó thay đổi kích thước bộ đệm, nhưng slice có lẽ được rút ngắn để phản ánh số byte đã đọc. Nhưng bạn đúng rằng giá trị trả về của 'Read :: read' cho bạn biết số lượng bộ đệm là hợp lệ. Nó ** rất quan trọng ** để sử dụng, nếu không bạn có thể gặp rắc rối như Heartbleed, nơi một bộ đệm được tái sử dụng với nội dung cũ! Đó có thể là một lý do tốt để sử dụng 'BufReader'. – Shepmaster

+0

Xin lỗi, bạn nói đúng, ý tôi là "rút ngắn độ dài của bộ đệm". –

Các vấn đề liên quan