2013-05-23 9 views
32

Jeśli wywołać funkcję za pomocą parSapply, wówczas instrukcje print, message lub cat wewnątrz tej funkcji nie wydają się wyprowadzać na konsolę.Jak mogę `print` lub` cat` przy użyciu równoległego

Mój proces trwa bardzo długo, więc potrzebuję sposobu na zobaczenie postępu i uzyskanie wyników wyjściowych po ich wykonaniu. Czy są jakieś specjalne polecenia, które pozwolą mi drukować na konsoli z równoległego procesu?

Przykład:

library(parallel) 

oneloop = function(x) { 
    for(i in 1:50) { 
    a = rnorm(100000) 
    a = sort(a) 
    } 
    print(x) 
    message(x) 
    cat(x) 
} 

cl <- makeCluster(5) 
output = parSapply(cl, 1:10, oneloop) 
stopCluster(cl) 
+0

Dzięki, zmieniono tak, aby uwzględnić tę – Corone

+0

czy 'flush.console' ma jakiś efekt? –

+0

@TylerRinker, fajny pomysł, ale nie, nie robi różnicy. Myślę, że wyjścia dla procesów roboczych nie mogą zostać przechwycone ... ... więc może być pytanie "czy możesz przekierować standardowe wyjście do głównego wyjścia", ale teraz spekuluję. – Corone

Odpowiedz

31

Korzystanie outfile param w makeCluster można przekierować wyjście do pliku, a następnie sprawdzić, czy plik, aby zobaczyć, jak rozwija się Twój program.

Co ciekawe na komputerze z systemem Linux ustawienie go na "" powoduje wyjście do konsoli, ale to nie działa dla mnie na komputerze z systemem Windows. Plik wyjściowy działa na obu.

+2

Nieco inne podejście do uzyskania pliku dziennika postępu przy użyciu '% dopar%' jest szczegółowo udokumentowane tutaj: http: //viksalgorithms.blogspot. com/2012/02/monitoring-progress-inside-foreach-loop.html – Ben

+0

'outfile =" "' nie działa w systemie Windows z Rgui, ale działa z Rterm. –

+3

To dziwne, jak źle to udokumentowano. Musiałem przedzierać się przez kod źródłowy przez dobre 15 minut, zanim znalazłem dokładnie to, co robi 'outfile' (w zasadzie dodawane do polecenia wysyłanego do terminala jako' OUT = '' outfile'). Przesyłanie do terminala z '" "' jest zgodne z np. 'Write.table', które przyjmuje połączenie' '' 'do znaczenia' stdout' – MichaelChirico

2

Używam makeCluster z outfile w systemie Windows z pakietem doParallel w wersji 1.0.8. Jestem w stanie ogonić outfile używając prostej komendy Powershell powershell Get-Content c:/path/to/log/mylog.txt -wait. Pracuje dla mnie.

Powiązane problemy