Стандартный вывод не получен внутри цикла foreach

Я использую doParallel для довольно долгой параллельной обработки с foreach. В отличие от большинства примеров, которые я вижу, где в цикл подается код с интенсивными вычислениями, но легкий ввод, я использую foreach для координации одновременной обработки ряда больших независимых наборов данных. Итак, внутри цикла я использую метаданные для чтения файла с диска, работы с ним и обратной записи.

Прежде чем превратить эту операцию в цикл foreach, я писал отладочные сообщения, используя messages(). Однако с тех пор, как я переключился на использование foreach и %dopar%, я заметил, что цикл «гаснет»: он делает то, что должен, но я не получаю никакого вывода. (Я должен упомянуть, что этот цикл прописан в сценарии, который я вызываю из оболочки с помощью Rscript.)

Я предполагаю, что это как-то связано с тем фактом, что doParallel порождает другие потоки — может быть, эти потоки больше не знают, куда выводить стандартный вывод? Мысли?


person jimjamslam    schedule 13.07.2017    source источник
comment
Я не гений параллельных вычислений, но определенно верно, что кластеры типа сокетов в R не возвращают выходные данные (например, индикаторы выполнения, сообщения и т. д.), пока задание не завершится и не вернет выходные данные. Я никогда не работал с кластерами форк-типа, поэтому не знаю, обойдет ли это это ограничение или нет. В прошлом я отчаянно нуждался в индикаторе выполнения несколько раз, и есть обходной путь, когда количество параллельных процессов невелико: написать отдельный непараллелизованный код для каждого задания и запускать каждое задание вручную в отдельный (одновременный) экземпляр R.   -  person Jacob Socolar    schedule 13.07.2017
comment
@JacobSocolar Уф, это в отчаянии;) Я запустил это небезосновательно через PBS и обнаружил, что в моих журналах есть сообщения об ошибках и предупреждения от оболочки (часть этой обработки включает использование system() для вызова других инструментов ), но не вывод message() в R. Так что, похоже, он есть. Я полагаю, что еще одним отчаянным ответом будет `система (эхо моего обновления) ...   -  person jimjamslam    schedule 13.07.2017


Ответы (1)


Если вы хотите вывести данные из цикла параллельного цикла foreach, просто используйте параметр outfile: makeCluster(no_cores, outfile = "").

person F. Privé    schedule 13.07.2017
comment
Проверю, когда вернусь с пробежки, но похоже, это именно то, что мне нужно :) - person jimjamslam; 13.07.2017