2016-05-06 30 views
7

Was ist die effizienteste Allzweckmethode zum Lesen von "großen" Dateien (die Text oder binär sein können), ohne in unsafe Gebiet zu gehen? Ich war überrascht, wie wenige relevante Ergebnisse es gab, als ich eine Websuche nach "Rost las große Datei in Stücken" durchführte.Der effizienteste Weg, um große Dateien in Chunks zu lesen

Zum Beispiel einer meiner Anwendungsfälle ist ein MD5-Prüfsumme für eine Datei rust-crypto mit berechnen (das Md5 Modul ermöglicht es Ihnen &[u8] chunks iterativ hinzufügen).

Hier ist, was ich habe, was etwas besser auszuführen scheint als einige andere Methoden wie 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); 
} 

Antwort

6

Ich glaube nicht, dass Sie Code effizienter als das schreiben kann. fill_buf auf einer BufReader über eine File ist im Grunde nur ein direkter Aufruf an read(2). Siehe https://github.com/rust-lang/rust/blob/e1195c24bb567019d7cdc65bf5a4c642e38475d1/src/libstd/io/buffered.rs#L185.

Das gesagt, BufReader ist nicht wirklich eine nützliche Abstraktion, wenn Sie es so verwenden; es wäre wahrscheinlich weniger umständlich, einfach file.read(&mut buf) direkt anzurufen.

+0

Danke für die Antwort! Ich dachte 'BufReader' war nützlich für mich, da es den Puffer für mich änderte, als ich das Ende des Lesers erreichte, aber ich merkte, dass das ziemlich trivial ist ... –

+2

* da es den Puffer änderte * - bezweifle ich das ändert die Größe des Puffers, aber die Schicht wird vermutlich verkürzt, um die Anzahl der gelesenen Bytes widerzuspiegeln. Aber Sie haben Recht, dass der Rückgabewert von "Read :: read" Ihnen sagt, wie viel des Puffers gültig ist. Es ist sehr wichtig ** das zu verwenden, sonst kann es zu einem Problem wie Heartbleed kommen, wo ein Puffer mit alten Inhalten wiederverwendet wird! Das könnte ein guter Grund sein, 'BufReader' zu verwenden. – Shepmaster

+0

Sorry, du hast recht, ich meinte "verkürzte die Länge des Puffers". –

Verwandte Themen