Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
rubyneko - RubyでえせMapReduceもどきを作ってみた。
[go: Go Back, main page]

いま話題の人気ページ&動画
ようこそ ゲスト さん
ホーム
ログイン

RubyでえせMapReduceもどきを作ってみた。

RubyでえせMapReduceもどきを作ってみた。

Enumerable#map_reduceを定義した。
このメソッドは二つの引数をとる。
一つ目はmap実行用のprocオブジェクト、
二つ目はreduce実行用のprocオブジェクトである。


module Enumerable
def map_reduce(map, reduce)
aggr = self.map {|i|
Thread.start { map.call(i) }
}
aggr.map {|t| t.value }.inject(&reduce;)
end
end


こんな感じで使える:

[1, 2, 3, 4, 5].map_reduce(lambda {|i| i**2 },
lambda {|r, e| r + e })


1から100000までの二乗和を
・普通にmapとinjectで求めたもの
・map_reduceで求めたもの
それぞれベンチマークをとってみた。


# 1から100000までの二乗和を計算する
require 'benchmark'
Benchmark.bm do |x|
x.report {
(1..100000).map {|i| i**2 }.inject {|r, e| r + e }
}
x.report {
(1..100000).map_reduce(
lambda {|i| i**2 },
lambda {|r, e| r + e } )
}
end


Erlangのような素敵な環境と、RubyのThreadを
何も考えずに使ったときの違いは言わずもがなである。
プロセッサの数などおかまいなし。

みんなの予想通り、ベンチマーク結果はこんな感じ:


user system total real
0.280000 0.010000 0.290000 ( 0.282418)
4.350000 3.210000 7.560000 ( 7.568136)


26倍ほど遅くなった。
(ちなみに7.56/0.29≒26はghciで計算した)

ruby 1.9で試してみると、

user system total real
0.220000 0.010000 0.230000 ( 0.227644)
map_reduce.rb:5:in `start': can't create Thread (35) (ThreadError)
from map_reduce.rb:5:in `block in map_reduce'
from map_reduce.rb:4:in `each'
from map_reduce.rb:4:in `map'
from map_reduce.rb:4:in `map_reduce'
from map_reduce.rb:18:in `block (2 levels) in '
from /Users/ujihisa/Documents/ruby-1.9.0/lib/ruby/1.9/benchmark.rb:293:in `measure'
from /Users/ujihisa/Documents/ruby-1.9.0/lib/ruby/1.9/benchmark.rb:377:in `item'
from map_reduce.rb:17:in `block in '
from /Users/ujihisa/Documents/ruby-1.9.0/lib/ruby/1.9/benchmark.rb:177:in `benchmark'
from /Users/ujihisa/Documents/ruby-1.9.0/lib/ruby/1.9/benchmark.rb:207:in `bm'
from map_reduce.rb:13:in `'

ありゃりゃ、死んじゃった。

チャンネル

フレンド

lapis25さん
otsuneさん
yagieyさん
adaさん
tac38fbさん

もっと見る

コメント

using sqlite3 with ActiveRecord without Rails
なるほど! 対象を指定しなきゃいけない
ujihisaさん
using sqlite3 with ActiveRecord without Rails
define のブロックパラメータに ActiveReco
novさん
Haskellで外部コマンド実行
おお、そんな手が! これで外部コマンドも
ujihisaさん
Haskellで外部コマンド実行
UnsafeIOのunsafePerformIOを使えば、IO a
takkanmさん
[Ruby] Infty
macすげ。 http://blog.netswitch.jp/ar
nankiさん