Я пытаюсь удалить дерево файлов параллельно с Rust. Я использую jwalk для параллельного обхода и удаления файлов. Приведенный ниже код удаляет все файлы. В целом работает как положено, но производительность ужасна.
По сравнению с Python версией, которую я реализовал, на Windows она работает в 5 раз медленнее! Что я делаю не так, так что версия Rust такая медленная?
Что я обнаружил до сих пор, так это то, что std::fs::remove_file
является причиной плохой производительности. Мне интересно, если реализация этой функции имеет проблемы с производительностью, по крайней мере на Windows?
Я использую Rust версии 1.42.0 с toolchain stable-x86_64-p c - windows -msv c.
let (tx, rx) = mpsc::channel();
WalkBuilder::new(tmpr)
.hidden(false)
.standard_filters(false)
.threads(cmp::min(30, num_cpus::get()))
.build_parallel()
.run(move || {
let tx = tx.clone();
Box::new(move |dir_entry_result| {
if let Ok(dir_entry) = dir_entry_result {
if dir_entry.file_type().unwrap().is_dir() {
tx.send(dir_entry.path().to_owned()).unwrap();
} else {
if let Err(_) = std::fs::remove_file(&dir_entry.path()) {
match fix_permissions(&dir_entry.path()) {
Ok(_) => {
if let Err(_) = std::fs::remove_file(&dir_entry.path()) {
tx.send(dir_entry.path().to_owned()).unwrap();
}
}
Err(_) => {
tx.send(dir_entry.path().to_owned()).unwrap();
}
}
}
}
}
ignore::WalkState::Continue
})
});
let paths: Vec<_> = rx.into_iter().collect();