2014-11-22 90 views
0

我有一個index.html頁面,我做了一個ajax調用,並且我得到了成功的ajax的JSON數據併發送JSON到其他函數。如何減少響應爲JSON的請求響應時間?

$.ajax({ 
    type : "GET", 
    url : 'get_data', 
    dataType : 'json', 
    success: function(data) { 
     update_page(data.info); 
    } 
}) 

在控制器我有

def get_data 
    parents = Parent.all 
    students = Student.all 
    teachers = Teacher.all 
    schools = School.all 

    @collection = {"parents" => parents, "students" => students, "teachers" => teachers, "schools" => schools} 

    respond_to do |format| 
     format.json { render json: Oj.dump({"info" => @collection.to_json(:except=> [:created_at, :updated_at]) }) } 
    end 
    end 

大約有1500記錄每個模型。它需要很多時間來響應,而且內存消耗也很高。我使用new relic來跟蹤響應時間,它花費了大約12000ms,我使用oink和其他工具,如rack mini profiler,它顯示內存消耗和響應時間更高,但我不確定如何解決此問題。

請幫我解決這個問題。過去兩天我一直在嘗試,我找不到解決方案。

在此先感謝!

回答

0

其基本思想是隻查詢您需要的數據量。你是否真的需要所有的記錄(1500條記錄* 4個模型= 6000條記錄)?看看StackOverflow,有成千上萬的問題,但在一個頁面上,用戶只需要查看大約50個問題。也許你想爲你的頁面實現分頁。

UPDATE

如果在啓動時加載的所有記錄是必須的。你可能想看看瀏覽器的離線存儲。您將加載所有數據一次,將其存儲在瀏覽器中並使用脫機數據,而不是每個請求查詢所有數據。這是Firefox的。您可以輕鬆地找到其他瀏覽器的相似內容。

https://developer.mozilla.org/en-US/Apps/Build/Offline

+0

對不起,我實際上使用這些數據顯示在谷歌地圖上,因此我需要所有這些數據在同一頁 – logesh 2014-11-22 10:02:25

+0

@Logesh您確定在任何時間點,您的用戶需要查看所有學校/教師/父母/生?我想你的地圖將從一個只有幾十所學校的地方開始,這就是你需要查詢的數據量。當用戶瀏覽到地圖上的新位置時,將會加載更多數據。那個怎麼樣? – Hoa 2014-11-22 10:06:22

+0

這是一個好主意,但它不適合我,因爲最初我會放大以便顯示地圖中的所有標記,並且它們可能會聚集在一起。點擊羣集我會分手顯示。 – logesh 2014-11-22 10:10:44

0

考慮磁盤或內存caching。無論是瓶頸,SQL查詢還是JSON序列化,在從磁盤提供服務時都會很快。第一個請求將被緩存,顯然需要很長時間,但只有一次。但是,您必須注意自己的緩存失效。我非常肯定它會值得。