2013-04-11 6 views
3

하나의 객체에 결합하려는 커다란 배열 (1 천만 이상의 객체)을 가지고 있습니다 (간단히하기 위해 여기에 문자열을 가정 해 봅시다). 배열의 각 요소를 실행하십시오. 일부 처리를 통해 (함수 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'가 더 나은 선택이 될 수 있습니다). 현재의 모양에서 저는 후자가 메모리 소비면에서 훨씬 더 나쁘다는 것을 확신합니다 (특히 '메모'가 커지는 경향이있는 경우). – samuil

답변

0

저는지도가 줄어들면 (예를 들어 작성한대로) 매번 +이라는 새 문자열을 생성하고 있다고 확신합니다.

<<을 사용하면 원래 문자열을 수정하고 있습니다. GC주기가 짧아지면 좋을 것입니다.

예를 들어 문자열을 사용한다고 언급했습니다. 그래서 당신의 진짜 문제에 대해 대답하기가 어렵습니다.