2013-03-22 16 views
6

Ho un sacco di diversi processi R (lanciati in modo indipendente dalla riga di comando) che tutti hanno bisogno di caricare diversi file grandi. Per evitare l'intasamento della rete, voglio aggiungere un blocco/semaforo, ad es. tramite un file di blocco, in modo che ottengano il loro file uno dopo l'altro. Solo un processo dovrebbe essere in grado di acquisire il blocco, su un sistema Linux standard.C'è un modo per condividere un blocco (ad esempio un file di blocco) tra processi R?

+0

Quali vantaggi vi aspettate da attuare Questo? Quanti processi ci sono e quanto sono grandi i file? Non dovrebbe piuttosto essere implementato dal file server? – krlmlr

+1

Eseguo 15 processi sullo stesso server, le dimensioni dei file sono fino a 3 GB. Ho osservato ondate di processi che aspettano i loro file (CPU sprecata), seguiti da tempi in cui tutti sono informati (larghezza di banda sprecata). Scaglionare i tempi di caricamento porta a un uso più efficiente della CPU e della rete. Il fileserver tenta di soddisfare tutte le richieste contemporaneamente. –

risposta

3

Mentre io non riuscivo a trovare un pacchetto R, c'è il comando di Linux lockfile che può essere utilizzato:

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

invece di 'sistema ("rm -f/tmp/my_simple_lock")' è anche possibile utilizzare 'file.remove ("/ tmp/my_simple_lock")' – blueblob

1

Una versione forse più esplicita della risposta precedente. Se il file si accede si chiama il nome del file, e si opera in una singola directory ... (se si utilizzano diverse directory, poi ovvio sostituire il nome del file con l'intero percorso)

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