2013-04-11 2 views
3

У меня есть большой массив (10+ миллионов объектов), который я хочу объединить в один объект (для простоты, предположим здесь строку) и запустить каждый элемент в массиве через некоторую обработку (абстрагируется функцией do_stuff). Есть два естественных способа сделать это:Эффективность памяти по сравнению с уменьшением/введением в Ruby

memo = "" 
big_array.each do |e| 
    memo << do_stuff(e) 
end 
memo 

и

big_array.reduce("") do |memo, e| 
    memo + do_stuff(e) 
end 

уменьшения/впрыснуть синтаксис более эстетически привлекательным, но вопрос в том, что более памяти эффективным. Мы уже знаем, что each is marginally more time efficient than reduce, но как насчет памяти?

Я также не понимаю, как я мог бы использовать память памяти в Ruby, особенно на блоке кода, поэтому, если кто-то может предоставить некоторые указатели на это, я также буду признателен.

+0

Я думаю, что это зависит от того, что такое «памятка». Здесь, в первом случае, строка мутируется, и вы не создаете новый экземпляр на каждой итерации, как во втором примере. –

+0

В вашем втором примере вы также можете использовать '<<' вместо '+' (хотя 'each_with_object' был бы лучшим выбором тогда). В нынешней форме я почти уверен, что последнее намного хуже с точки зрения потребления памяти (особенно, если 'memo' имеет тенденцию к росту). – samuil

ответ

0

Я уверен, что с уменьшением карты (как написано в вашем примере) вы создаете новую строку каждый раз +).

Использование << вы изменяете оригинальную строку. Это должно быть лучше, поскольку будет вызвано меньшее количество циклов GC.

Вы упомянули, что используете строку в качестве примера; так что сложно ответить на вашу настоящую проблему.

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