2013-03-22 4 views
6

Ich habe eine Reihe von verschiedenen R-Prozessen (unabhängig von der Kommandozeile gestartet), die alle verschiedene große Dateien laden müssen. Um ein Verstopfen des Netzwerks zu vermeiden, möchte ich eine Sperre/einen Semaphor hinzufügen, z. über eine Sperrdatei, so dass sie ihre Datei nacheinander bekommen. Nur ein Prozess sollte in der Lage sein, die Sperre auf einem Standard-Linux-System zu erlangen.Gibt es eine Möglichkeit, eine Sperre (z. B. eine Sperrdatei) zwischen R-Prozessen zu teilen?

+0

Welche Vorteile erwarten Sie von der Umsetzung Dies? Wie viele Prozesse gibt es und wie groß sind die Dateien? Sollte das nicht eher vom Dateiserver implementiert werden? – krlmlr

+1

Ich führe 15 Prozesse auf dem gleichen Server, Dateigrößen sind bis zu 3 GB. Ich habe Wellen von Prozessen beobachtet, die auf ihre Dateien warten (CPU-Verschwendung), gefolgt von Zeiten, in denen alle Daten berechnen (Bandbreite verschwendet). Das Versetzen der Ladezeiten führt zu einer effizienteren CPU- und Netzwerknutzung. Der Fileserver versucht alle Anfragen gleichzeitig zu erfüllen. –

Antwort

3

Während ich nicht ein R-Paket finden konnte, ist es der Linux-Befehl lockfile die verwendet werden können:

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

anstelle von 'system (" rm -f/tmp/my_simple_lock ")' können Sie auch 'file.remove ("/tmp/my_simple_lock ")' 'verwenden – blueblob

1

Eine vielleicht noch deutliche Version der vorherigen Antwort. Wenn die Datei zugreifen Sie Dateinamen aufgerufen wird, und Sie arbeiten in einem einzigen Verzeichnis ... (wenn Sie verschiedene Verzeichnisse verwenden, dann offensichtlich Dateinamen mit dem gesamten Pfad ersetzen)

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")