Удалить дерево файлов параллельно с Rust - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь удалить дерево файлов параллельно с 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();

1 Ответ

0 голосов
/ 01 мая 2020

Я нашел причину замедления. Это был вирусный сканер. Причина, по которой версия Python была быстрее, заключается в том, что Python .exe игнорируется антивирусным сканером, а Rust exe - нет. После того, как я отключил антивирусный сканер, версия Rust стала молниеносной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...