Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中加速大型JSON解析和选择?_Ruby On Rails_Angularjs_Json_Postgresql - Fatal编程技术网

Ruby on rails 如何在Rails中加速大型JSON解析和选择?

Ruby on rails 如何在Rails中加速大型JSON解析和选择?,ruby-on-rails,angularjs,json,postgresql,Ruby On Rails,Angularjs,Json,Postgresql,我有一个包含客户联系人的大型JSON文件,大小约为3.5MB,条目约为26k。包含的对象只有:id、:name、:email、:account\u id。我使用Rails作为后端API,在前端使用Angular 因此,当我想显示一个带有选择框的表单时,我要做的是查询Rails,其中包括:account_id等于我想要的客户对象 def get_account_contacts if params[:account_id].present? @contacts = JSON.pa

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

因此,当我想显示一个带有选择框的表单时,我要做的是查询Rails,其中包括
:account_id
等于我想要的客户对象

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文件中


我应该放弃一切希望,让它变得更快,还是我必须坚持走博士后的道路

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

您确定了瓶颈在哪里了吗

如果不是这样,我建议您手动调用并运行每一行,以查看需要更多时间的地方,为此,您需要使用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数据库,就您的目的而言,这可能就足够了


向你问好

我从一个私有的外部API获取它们,该API将结果限制为500,因此我必须循环一个作业才能检索到它们,因此我可以将它们直接写入db或文件。该文件可以很容易地进行设置和r/w,因为它在每次写入过程之前都会被重新创建,但db的速度要快得多。我只是不知道哪种方法更明智、更专业。因为你要根据account_id字段进行筛选,我认为数据库是解决问题的更好方法。如果你已经有一个数据库引擎在运行,请使用它,或者如果不够快,请尝试使用sqlite3迁移到postgres/mysql。如果你选择sqlite,你可能会发现使用sqlitebrowser很方便。我想说,放弃所有的希望,尝试创建一个基于文件的数据库。改用任何数据库。您可以规范化您的数据并将其存储在任何关系数据库中,您可以使用PostgreSQL存储
json(b)
文档,或者您也可以使用NoSQL数据库,其中任何一个都会比单个平面文件快得多,用户每次请求记录时都会读取它。@pozs但是我需要将25k行同时保存到数据库中,而不是将所有数据作为文本写入文件中。这会有问题吗?不,这甚至不算是一个大分贝。关系数据库可以存储数百万行。@pozs很明显,但是在很短的时间内存储25k行时,性能如何?一次存储所有数据也不成问题。F.ex。postgres具有此功能。其他数据库供应商可能有自己的方法来解决这个问题,但即使是多个插入也应该在几秒钟内运行(只考虑真正需要的索引设置)。通常,同步运行的次数明显少于读取。