├── README ├── mapreduce_runner.rb └── mapreduce_enumerable.rb /README: -------------------------------------------------------------------------------- 1 | By Blaine Cook. 2 | 3 | http://romeda.org/blog/2007/04/mapreduce-in-36-lines-of-ruby.html 4 | 5 | If you want to add `dinject` (reduce) please do: 6 | http://github.com/defunkt/mapreducerb 7 | 8 | In your shell: 9 | $ sudo gem install RingyDingy 10 | $ sudo gem install ruby2ruby 11 | $ ring_server & 12 | $ ruby mapreduce_runner.rb & 13 | $ ruby mapreduce_runner.rb & 14 | 15 | In IRB: 16 | >> require 'mapreduce_enumerable' 17 | >> (1..100).to_a.dmap { |v| v * 2 } 18 | -------------------------------------------------------------------------------- /mapreduce_runner.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'ruby2ruby' 3 | require 'ringy_dingy' 4 | 5 | ring_server = RingyDingy.new(nil).ring_server 6 | 7 | loop do 8 | pid, block, element, idx = ring_server.take([:dmap, nil, nil, nil, nil]).last(4) 9 | begin 10 | result = eval(block).call(element) 11 | rescue Object => err 12 | result = err 13 | end 14 | puts "Got #{result} from #{element} for #{pid}." 15 | ring_server.write([:dmap, pid, result, idx]) 16 | end 17 | -------------------------------------------------------------------------------- /mapreduce_enumerable.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | require 'ringy_dingy' 3 | require 'ruby2ruby' 4 | 5 | module Enumerable 6 | def dmap(&block) 7 | each_with_index do |element,idx| 8 | ring_server.write([:dmap, Process.pid, block.to_ruby, element, idx]) 9 | end 10 | 11 | results = [] 12 | while results.size < size 13 | result, idx = ring_server.take([:dmap, Process.pid, nil, nil]).last(2) 14 | results[idx] = result 15 | end 16 | 17 | results 18 | end 19 | 20 | def ring_server 21 | @ring_server ||= RingyDingy.new(nil).ring_server 22 | end 23 | end 24 | --------------------------------------------------------------------------------