一种快速加载大文件的方法

博客围绕服务中约20G索引文件加载问题展开。当前用mmap加载初始化快,但首次查询慢。提出两种加载方案,一种逐个读取,另一种采用xz压缩并行解压。对比发现,方案二在8线程下速度较方案一提高66%,虽需额外工作,但能解决首次查询慢问题,初步决定采用方案二。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的来源是这样的。

我们的服务有大概20G的索引文件(大概两百多个文件),现在的加载方式是使用mmap(该命令之后会有专门的一篇文章介绍)。使用这个命令的好处就是初始化速度非常快,但是也带来了一些问题。比如第一次查询某个词的时候速度就会特别慢,这当然和mmap只建映射却不拷贝有关。为了解决该问题,领导让我思考一下如何能快速的把20G的文件加载进来。

我是这么考虑的。首先一个一个文件读取是最简单的方案。毫无疑问,这种方案的瓶颈在于IO。如果要减小io,自然想到去压缩,但是解压过程是个费cpu的操作,那么是否可以并行呢?有点眉目了:0)

该方案的架构如下图所示:


选择的压缩方式是xz,其原因是xz的压缩率相对于gzip更高,而且解压速度和gzip相当(xz的压缩速度确实慢…)。

代码写出来了,两种方案的效果如何呢?

1.  首先压缩率为1/6(不同格式应有不同);

2.  方案二的速度在8线程的情况下较方案一提高了66%;

3.  但是如果重复加载,方案一的速度会很快,因为大部分已经在内存中了,操作系统并没有释放它们

4.  如果还有别的服务在该机器上,那么方案一的速度会很慢,因为不再是顺序读io了

回到原先的问题,首先不管哪个方案都可以结果第一次查询慢的问题。方案一的问题在于第一次启动的时候较慢,同时增加cpu也不能够改善性能。方案二需要额外做不少工作(如需要生成压缩文件,代码中加入解压的逻辑)。我们初步决定使用方案二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值