如果從軌在經歷超時,並且可以緩存數據(例如數據變化很少),我會用resque在後臺生成的響應或delayed_job,並讓Rails將其轉儲給客戶端。或者如果數據無法緩存,請使用lightweight Rack handler like Sinatra and Metal生成響應。
編輯,以反映樣本數據
我能夠在Rails 3.0.9實例運行下面的代碼針對高性能蒙戈1.8.4實例。我使用的是Mongo 1.3.1,bson_ext 1.3.1,webrick 1.3.1和Ruby 1.9.2p180 x64。它沒有超時,但需要一段時間才能加載。我的示例Mongo DB有100k條記錄,並且不包含索引。
before_filter :profile_start
after_filter :profile_end
def index
db = @conn['sample-dbs']
collection = db['email-test']
@final = []
@bs = collection.find({})
@bs.each do |a|
puts "dentro do bs.each"
@final << { :Email => a['headers']['to'], :At => a['date'], :subject => a['headers']['subject'], :Type => a['headers']['status'], :Message_id => a['headers']['message_id'] }
end
render :json => @final
end
private
def profile_start
RubyProf.start
end
def profile_end
RubyProf::FlatPrinter.new(RubyProf.stop).print
end
更有效的方式來轉儲記錄將
@bs = collection.find({}, {:fields => ["headers", "date"]})
@final = @bs.map{|a| {:Email => a['headers']['to'], :At => a['date'], :subject => a['headers']['subject'], :Type => a['headers']['status'], :Message_id => a['headers']['message_id'] }}
render :json => @final
我的數據生成
100000.times do |i|
p i
@coll.insert({:date =>Time.now(),:headers => {"to"=>"[email protected]", "subject"=>"meeeeeeeeee", "status" => "ffffffffffffffffff", "message_id" => "1234634673"}})
end
什麼是90K的項目?數組,ActiveRecord記錄,字符串?我已經在json中將Rails 3中的9百萬LatLon數組排除在外,沒有超時。 – christiangeek
這是來自MongoDB的90k條記錄。我得到BSON對象並使用.each將它添加到數組中。 – donald