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