Ruby on rails 如何在Rails中加速大型JSON解析和选择?
我有一个包含客户联系人的大型JSON文件,大小约为3.5MB,条目约为26k。包含的对象只有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
: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具有此功能。其他数据库供应商可能有自己的方法来解决这个问题,但即使是多个插入也应该在几秒钟内运行(只考虑真正需要的索引设置)。通常,同步运行的次数明显少于读取。