如何解压缩msgpack文件?

我正在将msgpack编码的数据写入文件。 在写作时,我只是使用C API的fbuffer。 如(我为示例划分了所有error handling):

FILE *fp = fopen(filename, "ab"); msgpack_packer pk; msgpack_packer_init(pk, fp, msgpack_fbuffer_write); msgpack_pack_int(pk, 42); // more data ... 

我该如何阅读此文件? 我发现的所有示例都假设数据在内存中,但是,我的文件高达5GB,将它完全保存在内存中并不是一个好主意。 我也不想自己阅读。 毕竟,我不知道msgpack对象有多长,所以很有可能我的缓冲区中有半个整数。

msgpack的unpack可以直接从磁盘读取吗? 或者是否有一些标准模式来做到这一点?

您可以考虑使用“msgpack_unpacker”,这似乎是MessagePack实现“流式”反序列化器的官方方式。 看一下msgpack -c / example / c / lib_buffer_unpack.c

此致,NiteHawk

好的,我设法做到了。

这是怎么写的:

 #include  #include  #include  int main(int argc, char **argv) { if(2 != argc) { fprintf(stderr, "Call all writeFile "); return; } FILE *fp = fopen(argv[1], "ab"); msgpack_packer pk; msgpack_packer_init(&pk, fp, msgpack_fbuffer_write); for(int i=0;i<2048;i++) { msgpack_pack_int(&pk, i); } fclose(fp); } 

这就是读取的样子:

 #include  #include  static const int BUFFERSIZE = 2048; int main(int argc, char **argv) { if(2 != argc) { fprintf(stderr, "Call with readFile "); return 1; } char *inbuffer = (char *) malloc(BUFFERSIZE); if(NULL == inbuffer) { fprintf(stderr, "Out of memory!"); return 1; } FILE *fp = fopen(argv[1], "rb"); size_t off = 0; size_t read = 0; msgpack_unpacked unpacked; msgpack_unpacked_init(&unpacked); do { read = fread(inbuffer, sizeof(char), BUFFERSIZE - off, fp); off = 0; while(msgpack_unpack_next(&unpacked, inbuffer, read, &off)) { msgpack_object_print(stdout, unpacked.data); puts(""); } memcpy(inbuffer, &(inbuffer[off]), read-off); off = read - off; } while(read != 0); free(inbuffer); fclose(fp); msgpack_unpacked_destroy(&unpacked); return 0; } 

我没有尝试,但我认为它也适用于更大的对象(数组,地图等)。