2009-08-04 21 views
52

En Ruby 1.8.6, tengo una matriz de, digamos, 100.000 identificadores de usuario, cada uno de los cuales es un int. Quiero realizar un bloque de código en estos identificadores de usuario, pero quiero hacerlo en fragmentos. Por ejemplo, quiero procesarlos 100 a la vez. ¿Cómo puedo lograr esto tan simple como sea posible?Cómo dividir una matriz en Ruby

que podía hacer algo como lo siguiente, pero probablemente hay una manera más fácil:

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

posible duplicado de [necesidad de dividir las matrices a sub arrays de tamaño especificado en Ruby] (http://stackoverflow.com/questions/3864139/need-to-split-arrays-to-sub-arrays- of-specified-size-in-ruby) – Nakilon

+0

@Nakilon: ¿No es esa la pregunta más nueva que esta? –

+0

@Andrew Grimm, para decidir cuál de las dos preguntas cerrar, miro no la fecha, sino la calidad de las respuestas. Quiero decir, le aconsejo a una persona que mira aquí, que vaya allí) – Nakilon

Respuesta

100

Uso each_slice:

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

Tenga en cuenta que en realidad tiene que "requerir" explícitamente al enumerador "" para que esto funcione: el método no está disponible en las clases que se mezclan en Enumerable, lo que inicialmente me llevó a pensar que esta respuesta era incorrecta. Entonces aprendí mejor. –

+4

Sí, debe requerir 'enumerador' en 1.8.6 para que esto funcione (y es por eso que lo hice). En 1.8.7+ el enumerador se ha movido al núcleo y ya no tiene que requerirlo. Sin embargo, hacerlo no causará un error, sino que simplemente devolverá falso. Por razones de compatibilidad, siempre debe requerir 'enumerador' cuando use métodos del enumerador, para que el código funcione con todas las versiones de ruby. – sepp2k

+0

Muchas gracias. :) – ChrisInEdmonton

20

Carriles tiene in_groups_of, que bajo el capó utiliza each_slice.

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

No usamos Rails. No escala lo suficientemente lejos para nosotros; nuestras bases de datos están fragmentadas en aproximadamente 26 fragmentos. Además, tenemos una cantidad significativa de otros servidores de bases de datos, probablemente otros veinte, aunque estos no están fragmentados. Gracias por la sugerencia, sin embargo, estoy seguro de que será útil para muchas otras personas. – ChrisInEdmonton

+1

Sí, entendí que no usabas raíles, por lo que me conecté a la fuente para poder utilizar el método si así lo deseaste. – wombleton

+0

Y por qué te otorgé un +1. :) Una buena respuesta que no funcionó específicamente para mí, pero sí para otros. – ChrisInEdmonton

Cuestiones relacionadas