1

SinatraアプリでAPIをセットアップするために接続します。

各リクエストは15MBです。ページを更新するたびに、15MBのメモリが追加されます。各リクエストの後に情報をクリアするにはどうすればよいですか?

require 'rubygems'
require 'sinatra'
require 'active_record'
require 'mysql2'
require 'json'

client = Mysql2::Client.new(adapter: 'mysql2', host: '127.0.0.1', database: 'dev_app', username: 'root', password: 'root')

get '/people' do
  q = "select name, age from people;"
  people = client.query(q, :as => :json).map{|one| {one['name'] => one['age'].to_i}}
  return people.to_json
  people = nil
end
4

2 に答える 2

1

プロファイル、プロファイル、プロファイル

アプリケーションで実際にメモリを消費しているものを特定していません。したがって、あなたの問題は未定義であり、「解決策」は、潜在的な答えを探して悩むことになります。

考えられる答え

  1. あなたが実際にそれを使い果たしない限り、メモリの増加は本質的に問題ではありません。それが起こらない場合は、そのままにしておきます。
  2. mysql2 gemには、いくつかの既知のメモリの問題があります。それはあなたのシナリオに当てはまるかもしれません。
  3. 変数またはリテラルがスコープ外になったという理由だけでガベージコレクションが発生するわけではありません。ガベージコレクションをトリガーする条件がありますが、本当にメモリに制約がない限り、ガベージコレクションをいじったり、ガベージコレクターにパッチを適用したりしないでください。
  4. Sinatraでのスコープを理解して、オブジェクトがスコープ外になるタイミングを理解してください。ただし、オブジェクトがスコープ外であるからといって、ガベージコレクションされるわけではなく、ガベージコレクションされる可能性があります。
于 2012-08-03T13:46:11.553 に答える
0

これが重要かどうかはわかりませんが、get'/ people'ブロックの最後の行が呼び出されないことは間違いありません。これは、明示的に返されるためです。

return people.to_json # this exits the block
people = nil #this never gets called.
于 2012-08-03T12:57:11.257 に答える