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?
6
A
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")
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
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. –