2014-11-17 3 views
0

Мой массив имеет 75000 записей и выглядит следующим образом:Как ускорить процесс простой итерации массива?

orders = [{ :order_id=>"7617", 
      :date=>"2014-11-17 19:24:31", 
      :firstname=>"Jack", 
      :lastname=>"Bauer"}, 
      { :order_id=>"7618", 
      :date=>"2014-11-17 19:34:51", 
      :firstname=>"James", 
      :lastname=>"Bond"}, 
      ... ] 

мне теперь нужно перебрать этот массив со следующим кодом:

order_id_array = [] 
order_array = [] 

orders.each do |order| 
    prepared_order = prepare_order(order) 
    order_id_array << prepared_order[0] 
    order_array << prepared_order[1] 
end 


def prepare_order(order) 
    order_id = order[:order_id] 

    [ order_id, 
    { :order_id => order_id, 
     :name => "#{order[:firstname]} #{order[:lastname]}", 
     :date => Time.zone.parse(order[:date]), 
     :customer_id => Moped::BSON::ObjectId.new } ] 
end 

Этот процесс занимает около 15 секунд. Это слишком много. Иногда мой массив содержит 5M + хэши.

Как ускорить этот процесс?

Я пытался использовать parallel gem так:

Parallel.each(orders, :in_threads => 3){ |order| 
    ... 
} 

Однако это ничего не делает для меня.

+3

«Как ускорить этот процесс» - шаг 1 - найти, какая часть работает медленно. –

+0

Я искал более фундаментальный способ ускорения. Я здесь не очень тяжелый расчет, так что, даже если я, например. вытащил разбор времени, я все равно был бы в ситуации, когда мне приходилось перебирать их поодиночке. – ChristofferJoergensen

+0

Кстати, вы пробовали резьбу на МРТ? Плохая идея. Попробуйте JRuby или Rubinius, это может привести к лучшим результатам. –

ответ

2

Профилируйте свой код, чтобы узнать, что является узким местом.

Если бы я должен был догадаться, Time.zone.parse, вероятно, где> = 80% вычислений. Учитывая фиксированный формат даты, вы можете значительно повысить производительность, создав объект даты вручную, извлекая компоненты из подстрок в определенных диапазонах.

+0

Не могли бы вы показать мне, как улучшить «Time.zone.parse»? Я не могу изменить тот факт, что 'date' входит в строку как часовой пояс, который необходимо установить. – ChristofferJoergensen

+2

@ChristofferJoergensen: вы пропустили ключевое слово, «если бы мне пришлось угадать» :) –

+0

Я искал более фундаментальный способ ускорения. Все, что я делаю в методе 'prepare_order', необходимо, поэтому я больше искал ответ о том, как разделить процесс. – ChristofferJoergensen

Смежные вопросы