【发布时间】:2015-05-18 03:42:03
【问题描述】:
我有大量数据(大约 2 GB)需要使用 zlib (deflate()) 进行压缩。我目前正在一次性读取 500 kb 的数据,将其压缩并将其写入我的输出文件。
使用 1 个线程,一切都很好。数据已压缩,我可以将其写入并解压缩回来。
使用 2 个线程,进程在 deflate() 调用中挂起。
这是我的 2 个 zlib comp 线程调用的函数的概要。
static z_stream z_str;
zlib_compress(...., bool last, bool first)
{
if (first)
deflateInit(&z_str, Z_DEFAULT_COMPRESSION);
if (last)
flush = Z_FINISH;
else
flush = Z_SYNC_FLUSH;
....
....
status = deflate(&z_str, flush);
...
...
if (last)
deflateEnd(&z_str);
}
据我了解,这两个调用在调用 deflate() 时都引用了同一个 zstream,这会导致不良行为。
我尝试将 z_str 作为局部变量并相应地修改了代码。但是在解压缩时,它假设文件的总大小为 512,这实际上只是第一个数据块。
知道如何实现吗?
【问题讨论】:
-
看起来您的代码每次调用 zlib_compress() 时只调用一次 deflate()。您是否在每个线程中多次调用 zlib_compress 函数?如果是这样,那么 deflateInit() 和 deflateEnd 不应该是 zlib_compress() 调用的一部分;相反,它们应该只在处理序列的开始和结束时完成(对于每个线程)
-
@JeremyFriesner 我已经删除了大部分代码以便于理解。是的,我目前只调用一次,但不是每个线程。我在压缩第一个数据块(512 kb)时调用 deflateInit(),在压缩最后一块数据(
-
@JeremyFriesner 非常感谢。您可以将其发布为答案吗?我愿意接受。
-
好的,我已将我的 cmets 转换为答案。
标签: multithreading compression zlib