我正在处理一个海量的TSV(制表符分隔值)文件,并希望尽可能高效地完成。为此,我想在循环之前预先分配Vec
,以避免为每行分配新的Vec
:
let mut line = String::new();
let mut fields = Vec::with_capacity(headers.len());
while reader.read_line(&mut line)? > 0 {
fields.extend(line.split('\t'));
// do something with fields
fields.clear();
}
当然,借用检查器并不高兴,因为我们在 fields
可能仍然引用其内容的同时覆盖了 line
:
error[E0502]: cannot borrow `line` as mutable because it is also borrowed as immutable
--> src/main.rs:66:28
|
66 | while reader.read_line(&mut line)? > 0 {
| ^^^^^^^^^ mutable borrow occurs here
67 | fields.extend(line.split('\t'));
| ------ ---- immutable borrow occurs here
| |
| immutable borrow later used here
(Playground)这并不是问题,因为
fields.clear();
会移除所有引用,所以在循环开始时调用read_line(&mut line)
时,fields
实际上没有从line
借用任何东西。但是我该如何告诉借用检查器呢?
csv
中运作?或者直接使用csv
设置自定义分隔符?它具有摊销分配的配方。 - Masklinncsv
还做了更多我不需要的工作,比如处理带引号的字符串,所以我觉得手动方式会更快。除了解析之外,我在这里真的做了很少的处理。 - ThomasVec
,或者你可以直接使用迭代器呢? - Sven Marnach