# BigDataSearcher **Repository Path**: yanglei_yang/big-data-searcher ## Basic Information - **Project Name**: BigDataSearcher - **Description**: 实时大数据量计算demo....... - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-21 - **Last Updated**: 2025-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 设计方案: 开发语言:JAVA 1、源数据预热处理(服务启动阶段执行) - 将源数据文件(10亿条数据)按照每100W条进行切分,同时对切分的每个小文件的id进行升序排列,最终生成临时小文件。这里临时小文件是二进制文件,目的是降低每个临时小文件的大小,从而降低IO时间; - 使用多路归并排序的方式对所有生成的临时小文件进行id排序,并按照每100W条切分成最终的block文件(同样是二进制文件,为了提升读写的效率),确保每个block文件里的id不重叠,同时block文件的命名为:{固定前缀}_{最小ID}_{最大ID}的格式;并将所有block文件的元信息(最小id,最大id,block文件的路径)加载到本地内存里; 2、查询阶段 - 一次性读取请求ID文件(此处建议请求ID文件也是二进制文件,而非文本文本),获取到所有请求的id加载到内存(为了最大限度降低内存占用,此处使用RoaringBitmap保存); - 根据预热阶段加载的block文件的元信息,使用多线程并行+二分法查找的方式统计出这些请求ID归属在哪个block文件(即请求id大于等于该block文件的最小ID,并小于等于该block文件的最大ID),最终返回Map的数据类型,其中BlockFileMetaInfo为单个block文件的元信息对象,value为属于该block文件的请求ID列表; - 基于上一步获取到的Map信息,同样使用多线程并行方式读取涉及到的block文件,将文件内容加载到本地内存,此处为了降低内存占用,分别使用int数组和float数组的数据类型保存对应block文件里id,inventory,price信息。为了快速获取到每个请求ID对应的inventory和price信息,使用Map 来存储id和index的映射关系; - 使用多线程(ForkJoinPool线程池)的方式并行计算每个block文件归属下的请求ID的inventory的和值,以及price的和值,最终返回所有请求ID的inventory、price字段的和值; - 考虑到源数据每个月会更新一次,所以查询过程里添加了如果当前处于源数据更新期间,将限制查询操作的逻辑; 注: 1、上述方案的数据文件的存储介质建议最好使用SSD磁盘,以最大限度地提升文件的读写速率; 2、程序包建议运行在32核128GB内存的机器上,JDK版本使用JDK21,堆内存设置32GB,GC算法推荐使用ZGC; 3、源数据的生成脚本为:org.leiyang.scripts.v1.SourceDataCreateV1.go文件,入参n表示要生成的源数据记录数量;入参o表示源文件的生成路径; 4、请求ID文件的生成脚本为:org.leiyang.scripts.RequestIDsCreate.RequestIDsCreate.java; 5、实时计算的接口地址:http://{服务所在机器的IP}:28080/big/data/compute/v2