1

この一見単純な erb レンダリング ループのメモリが永遠にサイズが大きくなる理由を理解するのを手伝ってください。

「alltext.erb」は、次のような基本的なテキスト ファイルです。

<% 5000000.times do %>
  spam
<% end %>

以下のテスト ケースは、最終的に最大 670 MB になるまでメモリ内で増加します。

require 'erb'

filename = File.expand_path("../alltext.erb", __FILE__)
file_contents = File.read(filename)
renderer = ERB.new(file_contents)

# Undiagnosed memory leak below...
loop do

  html = renderer.result();

  # Display memory in kb
  puts `ps -o rss= -p #{Process.pid}`.to_i

  # Attempt to clear variables and force garbage collection
  html = nil
  filename = nil
  file_contents = nil
  renderer = nil
  GC.start

  # Display memory in kb
  puts `ps -o rss= -p #{Process.pid}`.to_i

  sleep(5)
end

すべての変数を nil に設定し、ガベージ コレクションを強制するだけでなく、スコープ外に出る (永遠ループの次の反復に進む) と、メモリがいくらか解放されることを期待します。ここで何が欠けているかを理解するのを手伝ってください。

私のルビーのバージョンは 1.9.2-p180 です。私はOSXを使用していますが、これはテストケースであり、現在のUbuntuサーバーで観察された動作を複製しています.

4

1 に答える 1

2

ayckoster が示唆したように、「ファイルを作成していて、決して閉じないでください」。使用する:

file_contents = File.read(filename)

それ以外の:

file_contents = File.new(filename).read
于 2012-05-08T23:35:34.813 に答える