一、背景
客户反馈关于“概率密度”计算功能,无法获得计算结果。由于其他使用物理服务器的客户并未遇到此问题,而该客户使用的是虚拟服务器,初步怀疑是服务器配置不足。经过多次升级后,问题依旧存在。因此,任务被派到我这边进行问题排查。
二、问题定位
经过深入分析,发现问题出在Elasticsearch(es)通过scroll方式分批读取大量数据上。原本这个过程需要十几分钟,导致接口响应严重超时。
三、解决方法
在搜索引擎中寻求es读取大量数据的优化策略无果,我转而考虑使用numpy库来解决耗时问题。 最终,我采取了以下策略:首先,在es中执行聚合查询,获取每个值的出现频率。然后,利用numpy的concatenate函数,根据这些频率生成必要的数据集。具体实现如下:
data = numpy.concatenate([numpy.repeat(result['key'], result['doc_count']) for result in agg_results])
这一方案在实战测试中表现出色,在多个环境下测试,都能在大约1秒钟内完成计算并响应。与之前最长10分钟的响应时间相比,响应速度提升了一百多倍。这一改进不仅解决了问题,也明显的提升了客户体验。
最后
欢迎在评论区分享你们的优化经验~