2014-11-22 139 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序列化,在从磁盘提供服务时都会很快。第一个请求将被缓存,显然需要很长时间,但只有一次。但是,您必须注意自己的缓存失效。我非常肯定它会值得。