Уменьшить количество звонков

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 или чего-то еще, что может помочь быстрее удалять файлы.

Почему бы вам не удалить их с помощью Java? docs.oracle.com/javase/8/docs/api/java/io/File.html#delete--

glenn jackman 30.03.2022 23:05

Будет ли это быстрее, чем ('rm' в цикле for), потому что удаление также занимает один файл, я думаю. Есть ли способ пакетировать и удалить

leoz 30.03.2022 23:27

rm может принимать несколько файловых аргументов, если вы настаиваете на этом, просто передайте команде группу имен файлов. Создайте буфер, заполните буфер примерно 10 именами файлов за раз, отправьте это в rm, затем очистите буфер и повторите. После цикла, если в буфере есть данные, отправьте их в rm

Ryan 30.03.2022 23:32

Это будет быстрее, потому что ему не нужно создавать оболочку и процесс rm для каждого файла. Вы исследовали использование Процессбилдер?

glenn jackman 30.03.2022 23:43

@leoHernandez Время, затраченное на работу rm, составляет около 99,9% создания процесса и 0,1% удаления файла, поэтому вы увидите значительное ускорение, если вы удалите с помощью Java, чтобы избежать создания процесса. Нет «пакетного удаления»: файлы по-прежнему удаляются один за другим в цикле, экономия полностью достигается за счет создания меньшего количества процессов. Если у вас есть SSD, вы можете дополнительно рассмотреть возможность распараллеливания.

that other guy 31.03.2022 00:05

Вы можете использовать xargs для запускать процессы параллельно

LMC 31.03.2022 00:07

... и xargs также могут помочь уменьшить количество запущенных процессов, даже если они не распараллелены. Хотя удаление через Java, вероятно, все еще не менее быстро.

John Bollinger 31.03.2022 00:38
checks.stream().map(Path::of).foreach(Files::delete);
Shawn 31.03.2022 00:46

@Shawn Не сработает, потому что Files.delete выдает исключение, а это значит, что он не считается потребителем.

VGR 31.03.2022 04:29

Большое спасибо, я стал лучше видеть это

leoz 31.03.2022 07:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
10
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте rm. Используйте Java.

Как указывали другие, создание процесса происходит намного медленнее, чем в вашей программе. Кроме того, использование системной команды для чего-то, что можно сделать в коде, — это просто плохой дизайн.

И наконец, используя Файлы.удалить, вы получаете независимость от платформы. Теперь ваш код можно написать один раз и запустить где угодно!

Вот как будет выглядеть ваш цикл:

for (String check : checks) {
    Files.delete(Path.of(check));
}

По сути, это то же самое, что rm сделал бы в любом случае.

Другие вопросы по теме