Ruby: Multithreading di un CSV con output

1

Ho uno script scritto in Ruby che ha raggiunto il limite massimo del processore Xeon del mio server per le ultime 2 ore. Dal momento che al momento utilizza solo 1 di quattro possibili core, voglio provare a riscrivere lo script per sfruttare tutti e quattro i core.

Posso usare il metodo .each_slice (n) sull'array che contiene i miei dati, ma sono curioso di sapere quale sarebbe il modo migliore / più efficace per scrivere questi dati in un file. Sembra che io abbia un paio di opzioni.

  1. Passa l'oggetto file alle funzioni chiamate dalla funzione Thread.new (presumo che sia legale in ruby?) e facciali scrivere come meglio credi.

  2. Ogni funzione memorizza i risultati negli array, restituisce l'array al completamento e lascia che il programma principale scriva sul disco.

  3. Passa lo stesso oggetto array a ciascun elemento e aggiungilo a tutti, quindi ordinalo.

La mia ipotesi è che, sebbene 2 probabilmente utilizzi più memoria, sarà di gran lunga il metodo più efficiente. C'è un modo diverso per realizzare ciò che sto facendo?

    
posta Jacobm001 15.08.2013 - 22:29
fonte

2 risposte

2

Non hai menzionato se è importante in quale ordine è l'output. Se non importa, userei una coda a thread singolo per ricevere messaggi da più thread di lettura / elaborazione. Quindi un altro thread potrebbe essere incaricato di leggere dalla coda e scrivere sul file di output.

Se l'ordine conta, il tuo # 2 sembra una buona idea.

Sono preoccupato che con i tuoi suggerimenti n. 1 e n. 3 che se uno non è molto attento con il blocco attorno all'oggetto di output condiviso (puntatore o array di file) che uno sarebbe nel territorio di "comportamento non definito".

    
risposta data 08.09.2013 - 14:37
fonte
1
  1. Pass the file object to the functions being called by the Thread.new function (I assume this is legal in ruby?) and have them write as they see fit.

Il modo in cui lo descrivi ogni thread elaborerà l'intero file.

  1. Have each function store the results in arrays, return the array on completion and let the main program then write to the disk.

Questo è possibile, tuttavia potrebbe essere necessario un uso intensivo della memoria per attivare una nuova discussione.

  1. Pass the same array object to each item and have them all add to it, then sort it.

Anche in questo caso è possibile, ma potrebbero risentire degli stessi problemi di 2.

Se lo strumento ha raggiunto il massimo di un core, può utilizzare una buona porzione di 4 core e l'avvio di troppi thread utilizzerà la capacità che si potrebbe desiderare per l'elaborazione del file. Potresti voler utilizzare un pool di thread e creare il lavoro da lì.

Potresti anche sottoporre a pre-elaborazione il file, elaborarlo parzialmente o dividerlo in più parti gestibili dall'elaborazione.

    
risposta data 16.08.2013 - 01:36
fonte

Leggi altre domande sui tag