Linux系统。我通过libcurl下载了很多数据。一个数据的熵很低,但大小很大(几十GB)。现在我先下载文件,然后用zlib压缩它。
但这需要更多的时间和空间。所以我尝试在libcurl write回调中动态实现压缩。
主要问题是要下载的数据的确切大小未知。代码是脏的,但它只是一个测试。看来这不是一条路。也许其他方式更合适?
unsigned char *outZ=malloc(1500);//Maximum write chunk is 1448
...
size_t
curl_write_func(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t data=zip(ptr,size*nmemb,outZ,1500,Z_FINISH);
fwrite(outZ, 1, data, (FILE *) stream);
return (size*nmemb);
}
size_t
zip(void *source, size_t src_size, void *target,size_t tgt_size, int mode)
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
deflateInit(&strm, Z_BEST_COMPRESSION);
strm.next_in = source;
strm.avail_in = src_size;
strm.next_out=target;
strm.avail_out=tgt_size;
deflate(&strm, mode);
deflateEnd(&strm);
return (tgt_size - strm.avail_out);
}
最佳答案
你能控制服务器端发生的事情吗?
如果是,那么在libcurl端关闭内容解码时请求已经gzip的内容怎么样?以下是如何继续(从最近对邮件列表的讨论):request encoding without decoding。
否则,以流方式(例如,lalibarchive)提供流式处理功能的库(如HTML streaming parser with libcurl)应该可以做到这一点。
--
更新:下面是一个使用动态压缩的示例代码。
关于c - libcurl即时压缩下载的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15632005/