如何加速大型JSON解析并在Rails中选择?

时间:2016-01-05 07:42:32

标签: ruby-on-rails angularjs json postgresql

我有一个包含客户联系人的大型JSON文件,大小约为3.5MB,条目约为26k。包含的对象只有:id, :name, :email, :account_id。我在前面使用Rails作为后端API和Angular。

所以,当我想要显示一个带有选择框的表单时,我会这样做,包括:account_id等于我想要的客户对象,是查询Rails。

def get_account_contacts
   if params[:account_id].present?
      @contacts = JSON.parse(File.read('data/contacts.json'))
      @account_id = params[:account_id]
      @contacts_by_account_id = @contacts.select {|k| k["account"] == @account_id}
      render json: @contacts_by_account_id
   end
end

问题是查询需要8到13秒才能完成,因此它会让想要从下拉列表中选择值的用户感到困惑。我试图添加一个微调器,但这种查询的时间太长了13秒,所以我希望找到可以减少负载的方法。

我想到的一件事是将所有JSON对象保存到Postgres表,这将使整个实体超快。客户联系人JSON很少得到大的更改,所以我每天都在运行一个cron作业来获取数据并将它们写在.json文件中。

我是否应该放弃所有的希望,让它更快,或者我必须遵循Postgres坚持的道路?

2 个答案:

答案 0 :(得分:1)

用于解析大型json字符串。我建议你使用一些高性能的JSON解析器gem,如oj

答案 1 :(得分:1)

您是否确定了瓶颈所在?

如果不是,我建议您拨打binding.pry并手动运行每一行以查看需要更多时间的地方,为此您需要使用rails服务器运行服务器。

def get_account_contacts
   if params[:account_id].present?
      binding.pry
      @contacts = JSON.parse(File.read('data/contacts.json'))
      @account_id = params[:account_id]
      @contacts_by_account_id = @contacts.select {|k| k["account"] == @account_id}
      render json: @contacts_by_account_id
   end
end
  

客户联系人JSON很少会收到大的更改,所以我每天都在运行一个cron作业来获取数据并将它们写在.json文件中。

如果你直接从数据库中获取它,你可能会通过直接调用该数据库上的查询(没有json文件作为中间步骤)来做得更好,数据库就是为这种工作设计的。

如果你想避免设置postgresql数据库,你总是可以使用sqlite3数据库,为了你的目的,它可能就足够了。

最诚挚的问候!