Linux。libcurlを介して大量のデータをダウンロードしています。データのエントロピーは低くなりますが、サイズは大きくなります(数十Gb)。現時点では、最初にファイルをダウンロードしてから、zlibで圧縮します。
しかし、これにはより多くの時間とスペースが必要です。だから私はlibcurl書き込みコールバックでその場で圧縮を実装しようとしています。
主な問題は、ダウンロードするデータの正確なサイズが不明であるということです。コードは汚れていますが、それは単なるテストです。そして、これは進むべき道ではないようです。たぶん他の方法がより適していますか?
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);
}