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/

10-11 23:09
查看更多