R параллельный системный вызов для файлов

Я должен конвертировать большое количество изображений RAW и использую программу DCRAW для этого. Поскольку эта программа использует только одно ядро, я хочу распараллелить это в R. Для вызова этой функции я использую:

system("dcraw.exe -4 -T image.NEF")

Это приводит к выводу файла с именем image.tiff в ту же папку, что и файл NEF, что вполне нормально. Теперь я попробовал несколько пакетов R, чтобы распараллелить это, но я получаю только бессмысленные результаты (вероятно, вызванные мной). Я хочу запустить большой список (более 1000 файлов) через этот системный вызов в r, полученный с помощью list.files()

Я мог только найти информацию о параллельном программировании для переменных внутри R, но не для системных вызовов. У кого-нибудь есть идеи? Спасибо!

2 ответа

Решение

Неважно, если вы используете переменные или system, Предполагая, что вы не в Windows (которая не поддерживает параллельное соединение), на любой приличной системе вы можете запустить

parallel::mclapply(Sys.glob("*.NEF"),
  function(fn) system(paste("dcraw.exe -4 -T", shQuote(fn))),
  mc.cores=8, mc.preschedule=F)

Он будет выполнять 8 рабочих мест параллельно. Но тогда вы можете не использовать R и использовать вместо

ls *.NEF | parallel -u -j8 'dcraw.exe -4 -T {}'

вместо этого (используя GNU параллельно).

В Windows я использую модификацию этого решения (наиболее популярную) для запуска множества команд, не превышающих, скажем, 4 или 8 одновременно:

Параллельное выполнение процессов оболочки

Это не решение R, но мне это нравится.

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