2011-06-26 25 views
1

我想一個JSON文件中返回有關90K的項目,但是當我打這個電話,我得到這個錯誤:的Rails 3:如何返回一個大JSON文件

Timeout::Error in ApisController#api_b 

time's up! 
Rails.root: /root/api_b 

我只需運行「軌道s「與默認導軌服務器。

什麼是使這項工作,並返回文件的方式?

感謝

@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 

被@bs從MongoDB中的BSON對象。超時在「@final < < ...」

+0

什麼是90K的項目?數組,ActiveRecord記錄,字符串?我已經在json中將Rails 3中的9百萬LatLon數組排除在外,沒有超時。 – christiangeek

+0

這是來自MongoDB的90k條記錄。我得到BSON對象並使用.each將它添加到數組中。 – donald

回答

1

如果從軌在經歷超時,並且可以緩存數據(例如數據變化很少),我會用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 
+0

我有exactl你的第一個選項,但是,30秒超時在這裏:@final << {:Email => a ['headers'] ['to'],:At => a ['date'],: subject => a ['headers'] ['subject'],:Type => a ['headers'] ['status'],:Message_id => a ['headers'] ['message_id']}來自MongoDB的數據並將其放入數組中。 – donald

+0

我編輯了這個問題。謝謝 – donald

+0

我有和你一樣的代碼,只有15k文件纔會超​​時。爲什麼會這樣?也許是因爲每個物體都比較大? – donald