tengo el siguiente escenario:gran manipulación de matrices es muy lento en rubí
tengo que averiguar la lista de identificadores únicos a través de un conjunto muy grande.
Así que, por ejemplo, tengo 6000 matrices de identificadores (lista de seguidores), cada una puede tener un rango de tamaño entre 1 y 25000 (su lista de seguidores).
Quiero obtener la lista única de identificadores en todas estas matrices de identificadores (seguidores únicos de seguidores). Una vez hecho esto, necesito restar otra lista (la lista de seguidores de otra persona) de los identificadores y obtener un recuento final.
El conjunto final de identificadores únicos crece a alrededor de 60,000,000 de registros. En ruby cuando se agregan las matrices a la gran matriz, comienza a ser muy lento alrededor de un par de millones. Agregar al conjunto lleva .1 segundos al principio, luego crece a más de 4 segundos a 2 millones (no muy cerca de donde tengo que ir).
Escribí un programa de prueba en Java y lo hace todo en menos de un minuto.
Tal vez estoy haciendo esto ineficientemente en ruby, o hay otra manera. Desde mi código principal es propietaria he escrito un programa simple prueba para simular el tema:
big_array = []
loop_counter = 0
start_time = Time.now
# final target size of the big array
while big_array.length < 60000000
loop_counter+=1
# target size of one persons follower list
random_size_of_followers = rand(5000)
follower_list = []
follower_counter = 0
while follower_counter < random_size_of_followers
follower_counter+=1
# make ids very large so we get good spread and only some amt of dupes
follower_id = rand(240000000) + 100000
follower_list << follower_id
end
# combine the big list with this list
big_array = big_array | follower_list
end_time = Time.now
# every 100 iterations check where we are and how long each loop and combine takes.
if loop_counter % 100 == 0
elapsed_time = end_time - start_time
average_time = elapsed_time.to_f/loop_counter.to_f
puts "average time for loop is #{average_time}, total size of big_array is #{big_array.length}"
start_time = Time.now
end
end
Cualquier sugerencia, es hora de cambiar a jruby y mover cosas como esta para java?
Sólo quería señale que tenía 'loop_counter = 0' en su sección de tiempo. Si bien el enfoque de acceso a la matriz es ** mucho más lento ** de lo que sugería el enfoque hash, el tiempo de bucle en realidad no crece tan rápido. En 2 millones de registros, el tiempo de ciclo se triplica a aproximadamente .27 segundos en mi máquina, a partir de un tiempo de ciclo inicial de .09 segundos. –
Ruby es bastante rápido, solo lo haces de la manera incorrecta. Este es realmente un caso de uso para una base de datos, no manipulación de matrices en memoria en ningún idioma. Un buen DBM puede encontrar rápidamente valores y asociaciones distintos, todo antes de que la consulta salga de la base de datos. Recomendaré [Sequel] (http://sequel.rubyforge.org/) como una gran base de datos ORM que hará que sea más fácil de mantener y consultar. –