I have arraylist of filenames (java) and I want to delete these files using rm
for(String check: checks){
here I am removing each file using rm
}
но это отнимает много времени, могу ли я выполнить пакетную обработку с помощью xargs или чего-то еще, что может помочь быстрее удалять файлы.
Будет ли это быстрее, чем ('rm' в цикле for), потому что удаление также занимает один файл, я думаю. Есть ли способ пакетировать и удалить
rm может принимать несколько файловых аргументов, если вы настаиваете на этом, просто передайте команде группу имен файлов. Создайте буфер, заполните буфер примерно 10 именами файлов за раз, отправьте это в rm, затем очистите буфер и повторите. После цикла, если в буфере есть данные, отправьте их в rm
Это будет быстрее, потому что ему не нужно создавать оболочку и процесс rm для каждого файла. Вы исследовали использование Процессбилдер?
@leoHernandez Время, затраченное на работу rm, составляет около 99,9% создания процесса и 0,1% удаления файла, поэтому вы увидите значительное ускорение, если вы удалите с помощью Java, чтобы избежать создания процесса. Нет «пакетного удаления»: файлы по-прежнему удаляются один за другим в цикле, экономия полностью достигается за счет создания меньшего количества процессов. Если у вас есть SSD, вы можете дополнительно рассмотреть возможность распараллеливания.
Вы можете использовать xargs для запускать процессы параллельно
... и xargs также могут помочь уменьшить количество запущенных процессов, даже если они не распараллелены. Хотя удаление через Java, вероятно, все еще не менее быстро.
checks.stream().map(Path::of).foreach(Files::delete);@Shawn Не сработает, потому что Files.delete выдает исключение, а это значит, что он не считается потребителем.
Большое спасибо, я стал лучше видеть это




Не используйте rm. Используйте Java.
Как указывали другие, создание процесса происходит намного медленнее, чем в вашей программе. Кроме того, использование системной команды для чего-то, что можно сделать в коде, — это просто плохой дизайн.
И наконец, используя Файлы.удалить, вы получаете независимость от платформы. Теперь ваш код можно написать один раз и запустить где угодно!
Вот как будет выглядеть ваш цикл:
for (String check : checks) {
Files.delete(Path.of(check));
}
По сути, это то же самое, что rm сделал бы в любом случае.
Почему бы вам не удалить их с помощью Java? docs.oracle.com/javase/8/docs/api/java/io/File.html#delete--