Ruby Memory Management

后端 未结 5 1855
遥遥无期
遥遥无期 2020-12-23 21:32

I have been using Ruby for a while now and I find, for bigger projects, it can take up a fair amount of memory. What are some best practices for reducing memory usage in Ru

5条回答
  •  情话喂你
    2020-12-23 22:24

    Measure and detect which parts of your code are creating objects that cause memory usage to go up. Improve and modify your code then measure again. Sometimes, you're using gems or libraries that use up a lot of memory and creating a lot of objects as well.

    There are many tools out there such as busy-administrator that allow you to check the memory size of objects (including those inside hashes and arrays).

    $ gem install busy-administrator
    

    Example # 1: MemorySize.of

    require 'busy-administrator'
    
    data = BusyAdministrator::ExampleGenerator.generate_string_with_specified_memory_size(10.mebibytes)
    
    puts BusyAdministrator::MemorySize.of(data)
    # => 10 MiB
    

    Example # 2: MemoryUtils.profile

    Code

    require 'busy-administrator'
    
    results = BusyAdministrator::MemoryUtils.profile(gc_enabled: false) do |analyzer|
      BusyAdministrator::ExampleGenerator.generate_string_with_specified_memory_size(10.mebibytes)
    end  
    
    BusyAdministrator::Display.debug(results)
    

    Output:

    {
        memory_usage:
            {
                before: 12 MiB
                after: 22 MiB
                diff: 10 MiB
            }
        total_time: 0.406452
        gc:
            {
                count: 0
                enabled: false
            }
        specific:
            {
            }
        object_count: 151
        general:
            {
                String: 10 MiB
                Hash: 8 KiB
                BusyAdministrator::MemorySize: 0 Bytes
                Process::Status: 0 Bytes
                IO: 432 Bytes
                Array: 326 KiB
                Proc: 72 Bytes
                RubyVM::Env: 96 Bytes
                Time: 176 Bytes
                Enumerator: 80 Bytes
            }
    }
    

    You can also try ruby-prof and memory_profiler. It is better if you test and experiment different versions of your code so you can measure the memory usage and performance of each version. This will allow you to check if your optimization really worked or not. You usually use these tools in development / testing mode and turn them off in production.

提交回复
热议问题