【发布时间】:2023-07-11 05:51:01
【问题描述】:
我正在尝试从多个线程读取 gzip 压缩文件。
我认为这会显着加快解压缩过程,因为我在多个线程中的 gzread 函数从不同的文件偏移量开始(使用 gseek),因此它们读取文件的不同部分。
简化后的代码是这样的
// in threads
auto gf = gzopen("file.gz",xxx);
gzseek(gf,offset);
gzread(xx);
gzclose(gf);
令我惊讶的是,我的多线程版本程序确实没有加速。 20线程版本使用的时间与单线程版本完全相同。我很确定这远离磁盘瓶颈。
我猜 zlib 膨胀功能可能需要解压缩整个文件才能读取一小部分,但我没有从他们的手册中得到任何线索。
有人知道如何加快速度吗?
【问题讨论】:
-
通常大部分时间都花在数据读取上。不是在减压。将您的数据放在可用的最快媒体上,然后重试。
-
@GMichael 感谢您提供线索。我做了实验,我为两个压缩文件运行相同的程序,一个压缩级别较高,大小为 600M,另一个压缩级别较低,但大小为 2G。第一个文件用了 22 秒,而后者用了 10 秒。所以更有可能是减压的原因。
-
也许尝试在每个线程中使用相同的文件句柄而不是单独打开它
-
@fandin 如果是这种情况,请检查 CPU 上的负载。您应该看到所有过去的 CPU 都在性能方面受益。顺便说一句,不要打开太多线程。上下文切换需要时间。
-
@fanbin 尝试为每个线程复制
gf结构
标签: c++ multithreading zlib compression deflate