Skip to content

Ruby Gem: Reduce memory usage for a large number of config. For example, game config in excel

License

Notifications You must be signed in to change notification settings

libinzhangyuan/s_matrix

Repository files navigation

Current version 1.0.2

Matrix is a ruby gem for storing hurge constant data in ruby process memory.

for example, I have a huge config for game server ".gspec/gequipment_strengthen.plist". It will delay my request if storing the data in redis and the stress of redis is high. It will consume large memory (480M) when storing the data by ruby hash object. So I made this gem. It's fast and it comsume 5M memory only.

Matrix store the hash like this:

  {
    '234234' => {'id' => '23232', 'name' => 'haha'},
    '234235' => {'id' => '23235', 'name' => 'haha2', 'hp' => '232'}
    '234236' => {'id' => '23235', 'name' => 'haha2', 'attack' => '2322'}
  }
  For example, loading a game config .gspecgequipment_strengthen.plist will use 480M when using ruby Hash like this:
    {'234232' => {id: '23423', name: 'haha'}}
   Because there are about 1440000 ruby String objects when loading to memory.
     And it will use 5M when using SMatrix.
Result from test:   rspec .gspecgperformance_spec.rb

Installation

Add this line to your application's Gemfile:

gem 's_matrix', '~>1.0'

And then execute:

$ bundle

Or install it yourself as:

$ gem install s_matrix

Init the data at initialise of the ruby progrem.

  # example for rails, config/initializers/init_game_data.rb
  # every thing will change to string (.to_s) when saving to SMatrix
  #  EQUIPMENTS = SMatrix.new
  # load_your_equipments_excel.each do
      EQUIPMENTS.add_row('10001', {'id' => '10001', 'name' => 'wood sword', 'attack' => '342'})
      EQUIPMENTS.add_row('20002', {id: 10002, name: 'shoe', speed: 5})
  # end
  ROLES = SMatrix.new
  # load_your_role_excel.each do
      ROLES.add_row('30002', {id: 30002, name: 'Fighter', speed: 20})
  # end

Read the data

  # everything get back will be string
    EQUIPMENTS['10001'].should == {'id' => '10001', 'name' => 'wood sword', 'attack' => '342''}
    EQUIPMENTS['10001']['id'].should == '10001'
    EQUIPMENTS['20002'].should == {'id' => '10002', 'name' => 'shoe', 'speed' => '5'}
    EQUIPMENTS['20002']['attack'].should be_nil
    EQUIPMENTS.size.should == 2

  # or you can use get_row instead of []
    EQUIPMENTS.get_row('20002')

  # each
    EQUIPMENTS.each {|k, v| k == '10001', v == {'id' => '10001', 'name' => 'sword', ...} }

  # all
    EQUIPMENTS.all.should == { '20002' => {'id' => '10002', 'name' => 'shoe', 'speed' => '5'}, '20003' => {} }

  # first
    EQUIPMENTS.first.should == ['20002', {'id' => '10002', 'name' => 'shoe', 'speed' => '5'}]

  # ids
    EQUIPMENTS.ids.should == ['20002', '20003']

  # keys
    EQUIPMENTS.keys.should == ['id', 'name', 'hp']

  # find    -- find the first one
    EQUIPMENTS.find({name: 'shoe'}).should == ['20002', {'id' => '10002', 'name' => 'shoe', 'speed' => '5'}]

  # to_s for debug
    puts EQUIPMENTS.to_s

About

Ruby Gem: Reduce memory usage for a large number of config. For example, game config in excel

Resources

License

Stars

Watchers

Forks

Packages

No packages published