2013-03-22 11 views
6

Mam wiele różnych procesów R (niezależnie uruchamianych z wiersza poleceń), które wszystkie muszą załadować różne duże pliki. Aby uniknąć zatykania sieci, chcę dodać blokadę/semafor, np. za pomocą pliku blokady, aby otrzymać plik jeden po drugim. Tylko jeden proces powinien być w stanie uzyskać blokadę na standardowym systemie Linux.Czy istnieje sposób udostępniania blokady (na przykład pliku blokady) między procesami R?

+0

Jakie korzyści można oczekiwać od wdrożenia to? Ile jest procesów i jak duże są pliki? Czy nie powinno to być raczej realizowane przez serwer plików? – krlmlr

+1

Uruchamiam 15 procesów na tym samym serwerze, rozmiary plików wynoszą do 3 GB. Obserwowałem fale procesów, które czekają na swoje pliki (procesor zmarnowany), a następnie czasy, w których wszystkie one są obliczane (zmarnowana przepustowość). Przesunięcie czasów ładowania prowadzi do bardziej wydajnego wykorzystania procesora i sieci. Serwer plików próbuje spełnić wszystkie żądania naraz. –

Odpowiedz

3

Chociaż nie mogłem znaleźć pakiet R, istnieje polecenie Linux lockfile które można stosować:

write("Attempting to get lock", stderr()) 
system("lockfile /tmp/my_simple_lock") 

# Do stuff 

write("Releasing lock", stderr()) 
system("rm -f /tmp/my_simple_lock") 
+2

zamiast 'system (" rm -f/tmp/my_simple_lock ")' możesz również użyć 'file.remove ("/tmp/my_simple_lock ")' – blueblob

1

może bardziej wyraźne wersja poprzedniej odpowiedzi. Jeśli plik uzyskiwania dostępu nazywany jest nazwa pliku, a pracują w jednym katalogu ... (jeśli używasz różnych katalogów, to oczywiste zastąpić nazwę pliku z całej ścieżki)

write("Attempting to get lock", stderr()) 
system("lockfile filename.lock") 
\# do whatever you want to the file 
write("Releasing lock", stderr()) 
remove.file("filename.lock")