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 `'

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

チャンネル

フレンド

コメント

On Lisp読書会#2に行ってきた
ドタキャンした内の一人です。申し訳ない o
にゃかもとさん
Rubyとsqlite3でTF-IDFを計算してみよう
こんにちは,noriakiと申します. 私は
noriakiさん
using sqlite3 with ActiveRecord without Rails
なるほど! 対象を指定しなきゃいけない
ujihisaさん
using sqlite3 with ActiveRecord without Rails
define のブロックパラメータに ActiveReco
novさん
Haskellで外部コマンド実行
おお、そんな手が! これで外部コマンドも
ujihisaさん