我有一个包含客户联系人的大型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坚持的道路?
答案 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数据库,为了你的目的,它可能就足够了。
最诚挚的问候!