分配给 "lib/ruby/2.1.0/timeout.rb" 的 1GB 内存
1GB memory allocated to "lib/ruby/2.1.0/timeout.rb"
我在循环中使用 Twitter、Mongo 和 Parallel 来检索和存储数据。
内存利用率达到 1.5GB+
GC 怎么不清理这个?
更新: Here is the script in question.
allocated memory by location
-----------------------------------
973409328 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:82
359655091 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155
34706221 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/openssl/buffering.rb:182
31767589 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:368
22055648 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/parallel-1.6.1/lib/parallel.rb:183
12129637 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:525
11115133 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/protocol.rb:172
10609088 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/idna/pure.rb:177
8333448 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:152
6041744 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/thread_safe-0.3.5/lib/thread_safe/non_concurrent_cache_backend.rb:8
4857232 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:1477
4583920 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/monitor.rb:241
4524872 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/memoizable-0.4.2/lib/memoizable/method_builder.rb:117
4282752 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:151
4200641 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/monitoring/command_log_subscriber.rb:104
3283047 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:61
3150696 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/server/monitor.rb:125
allocated memory by gem
-----------------------------------
1084770550 ruby-2.1.5/lib
359655091 json-1.8.3
53016839 addressable-2.3.8
22069048 parallel-1.6.1
18422826 twitter-5.15.0
10829988 mongo-2.1.1
8908392 memoizable-0.4.2
6041744 thread_safe-0.3.5
4904294 faraday-0.9.2
3839455 other
3382080 naught-1.1.0
2429320 bson-3.2.6
1123917 rubygems
320962 rollbar-2.4.0
205097 activesupport-4.2.4
20005 multi_json-1.11.2
您正在加载 吨 数据(取决于您有多少用户),然后并行休眠 20 秒.所以基本上,如果您有一百个用户,您将同时检索 100 个用户的推特数据,然后休眠,再做一次,依此类推。此内存可能看起来像是归因于超时进程,因为在 20 秒睡眠期间由它负责。
尝试将您使用的线程数从 keys.length
减少到只有几个(玩弄数字)
Ruby 内存管理既优雅又繁琐。它将对象(名为 RVALUE
s)存储在大小约为 16KB 的所谓堆中。在低级别上,RVALUE
是一个 c
结构,包含不同标准 ruby 对象表示的联合。
所以,堆存储RVALUE
个大小不超过40字节的对象。对于 String
、Array
、Hash
等对象,这意味着小对象可以放入堆中,但一旦它们达到阈值,就会在 Ruby 将分配堆。
这个额外的内存是灵活的;一旦对象被 GC 处理,它就会被释放。但是堆本身不再释放到 OS。
就是说,一旦您将许多 短 字符串同时加载到 ruby 内存中,堆数量就会增加,并且此内存永远不会返回到 ruby.这听起来可能很奇怪,但请尝试 而不是 来存储 字符串,短于 23 个符号 。太疯狂了,对提议感到抱歉:)
我在循环中使用 Twitter、Mongo 和 Parallel 来检索和存储数据。
内存利用率达到 1.5GB+
GC 怎么不清理这个?
更新: Here is the script in question.
allocated memory by location
-----------------------------------
973409328 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:82
359655091 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155
34706221 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/openssl/buffering.rb:182
31767589 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:368
22055648 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/parallel-1.6.1/lib/parallel.rb:183
12129637 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:525
11115133 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/protocol.rb:172
10609088 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/idna/pure.rb:177
8333448 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:152
6041744 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/thread_safe-0.3.5/lib/thread_safe/non_concurrent_cache_backend.rb:8
4857232 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:1477
4583920 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/monitor.rb:241
4524872 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/memoizable-0.4.2/lib/memoizable/method_builder.rb:117
4282752 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:151
4200641 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/monitoring/command_log_subscriber.rb:104
3283047 /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:61
3150696 /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/server/monitor.rb:125
allocated memory by gem
-----------------------------------
1084770550 ruby-2.1.5/lib
359655091 json-1.8.3
53016839 addressable-2.3.8
22069048 parallel-1.6.1
18422826 twitter-5.15.0
10829988 mongo-2.1.1
8908392 memoizable-0.4.2
6041744 thread_safe-0.3.5
4904294 faraday-0.9.2
3839455 other
3382080 naught-1.1.0
2429320 bson-3.2.6
1123917 rubygems
320962 rollbar-2.4.0
205097 activesupport-4.2.4
20005 multi_json-1.11.2
您正在加载 吨 数据(取决于您有多少用户),然后并行休眠 20 秒.所以基本上,如果您有一百个用户,您将同时检索 100 个用户的推特数据,然后休眠,再做一次,依此类推。此内存可能看起来像是归因于超时进程,因为在 20 秒睡眠期间由它负责。
尝试将您使用的线程数从 keys.length
减少到只有几个(玩弄数字)
Ruby 内存管理既优雅又繁琐。它将对象(名为 RVALUE
s)存储在大小约为 16KB 的所谓堆中。在低级别上,RVALUE
是一个 c
结构,包含不同标准 ruby 对象表示的联合。
所以,堆存储RVALUE
个大小不超过40字节的对象。对于 String
、Array
、Hash
等对象,这意味着小对象可以放入堆中,但一旦它们达到阈值,就会在 Ruby 将分配堆。
这个额外的内存是灵活的;一旦对象被 GC 处理,它就会被释放。但是堆本身不再释放到 OS。
就是说,一旦您将许多 短 字符串同时加载到 ruby 内存中,堆数量就会增加,并且此内存永远不会返回到 ruby.这听起来可能很奇怪,但请尝试 而不是 来存储 字符串,短于 23 个符号 。太疯狂了,对提议感到抱歉:)