2009-08-04 13 views
52

In Ruby 1.8.6, ho una matrice di, diciamo, 100.000 id utente, ognuno dei quali è un int. Voglio eseguire un blocco di codice su questi ID utente, ma voglio farlo in blocchi. Ad esempio, voglio elaborarli 100 alla volta. Come posso raggiungere facilmente questo nel modo più semplice possibile?Come dividere un array in Ruby

avrei potuto fare qualcosa di simile a quanto segue, ma probabilmente c'è un modo più semplice:

a = Array.new 
userids.each { |userid| 
    a << userid 
    if a.length == 100 
    # Process chunk 
    a = Array.new 
    end 
} 
unless a.empty? 
    # Process chunk 
end 
+0

possibile duplicato di [Necessità di dividere gli array a sub array di dimensioni specificate in Ruby] (http://stackoverflow.com/questions/3864139/need-to-split-arrays-to-sub-arrays- di-specificato-size-in-ruby) – Nakilon

+0

@Nakilon: Questa domanda non è più nuova di questa? –

+0

@Andrew Grimm, per decidere quale delle due domande chiudere, non guardo la data, ma la qualità delle risposte. Voglio dire, consiglio a una persona che guarda qui, di andare lì) – Nakilon

risposta

100

Uso each_slice:

require 'enumerator' 
userids.each_slice(100) do |a| 
    # do something with a 
end 
+3

Si noti che in realtà è necessario "richiedere" enumeratore "" affinché funzioni correttamente: il metodo non è disponibile nelle classi che si combinano in Enumerable, il che inizialmente mi ha indotto a pensare che questa risposta fosse errata. Poi ho imparato meglio. –

+4

Sì, è necessario richiedere "enumeratore" in 1.8.6 perché funzioni (è per questo che l'ho fatto). In 1.8.7+ l'enumeratore è stato spostato al centro e non è più necessario richiederlo. Tuttavia, farlo non causerà un errore, ma restituirà semplicemente false. Quindi, per ragioni di compatibilita ', dovresti sempre richiedere' enumeratore 'quando usi i metodi dall'enumeratore, in modo che il codice funzioni con tutte le versioni di ruby. – sepp2k

+0

Grazie mille. :) – ChrisInEdmonton

20

Rails ha in_groups_of, che sotto il cofano utilizza each_slice.

userids.in_groups_of(100){|group| 
    //process group 
} 
+3

Non usiamo Rails. Non scala abbastanza lontano per noi; i nostri database sono suddivisi in circa 26 frammenti. Inoltre, disponiamo di un numero significativo di altri server di database, probabilmente altri venti o giù di lì, sebbene questi non siano soggetti a squilibri. Grazie per il suggerimento, sono sicuro che sarà utile per molte altre persone. – ChrisInEdmonton

+1

Sì, ho capito che non stavi usando i binari, motivo per cui mi sono collegato alla fonte in modo da poter estrarre il metodo se lo volevi. – wombleton

+0

E perché ti ho assegnato un +1. :) Una buona risposta che non ha funzionato in modo specifico per me, ma per gli altri. – ChrisInEdmonton

Problemi correlati