msgpack[C++]使用笔记 和 msgpack/cPickle性能对比


python版本的msgpack非常好用,速度上比python内置的pickle和cpickle都要快一些,C++版本的使用比较麻烦,下面是本人学习时的一个example,解析python-msgpack dump的一个复杂字典

  1. #include <msgpack.hpp>   
  2.   
  3. #include <fstream>   
  4. #include <iostream>   
  5. using namespace std;  
  6.   
  7. template <class T>  
  8. void msgunpack(const char* binary_file, T& t, char* buff, uint32_t max){  
  9.     msgpack::unpacked msg;  
  10.     ifstream tf_file(binary_file,ios::in|ios::binary|ios::ate);  
  11.     uint32_t size = tf_file.tellg();  
  12.     tf_file.seekg(0, ios::beg);  
  13.     tf_file.read(buff, size);  
  14.     tf_file.close();  
  15.     msgpack::unpack(&msg, buff, size);  
  16.     msg.get().convert(&t);  
  17. }  
  18.   
  19.   
  20. typedef map<uint32_t, uint32_t> WordsMap;  
  21. typedef map<uint32_t, WordsMap> FieldsMap;  
  22. typedef map<uint64_t, FieldsMap> DocsMap;  
  23.   
  24. int main(int argc, char** argv)  
  25. {  
  26.     uint32_t MAX_BUFF = 1024*1024*100; //100MB   
  27.     char* BUFF = new char[MAX_BUFF];  
  28.   
  29.     DocsMap docsMap;  
  30.     msgpack::unpacked msg;  
  31.     msgunpack("/data/wikidoc/tf_dict_for_nodes/1-1000", docsMap, BUFF, MAX_BUFF);  
  32.     //        msg.get().convert(&docsMap);   
  33.     cout << docsMap.size() << endl;  
  34.         delete[] BUFF;  
  35. }  

参考: http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387#QuickStartforC%2B%2B-ImplementationStatus


下面是本人自己封装的一个msgpack接口头文件mymsgpack.h

  1.  #ifndef MY_MSGPACK_H   
  2.   
  3. #ifndef MY_MSGPACK_H   
  4. #define MY_MSGPACK_H   
  5. #include <fstream>   
  6. #include <msgpack.hpp>   
  7. using namespace std;  
  8.   
  9. template <class T>  
  10. void load_from_file(const char* binary_file, T& t) {  
  11.         ifstream binaryFstream(binary_file,ios::in|ios::binary|ios::ate);  
  12.         uint32_t size = binaryFstream.tellg();  
  13.         char* buff = new char[size];  
  14.         binaryFstream.seekg(0, ios::beg);  
  15.         binaryFstream.read(buff, size);  
  16.         binaryFstream.close();  
  17.         msgpack::unpacked msg;  
  18.         msgpack::unpack(&msg, buff, size);  
  19.         msg.get().convert(&t);  
  20.         delete[] buff;  
  21. }  
  22.   
  23. template <class T>  
  24. void load_from_str(const char* binary_str, int len, T& t) {  
  25.         msgpack::unpacked msg;  
  26.         msgpack::unpack(&msg, binary_str, len);  
  27.         msg.get().convert(&t);  
  28. }  
  29.   
  30. template <class T>  
  31. void dump_to_file(T& t, const char* dump_file) {  
  32.     msgpack::sbuffer sbuf;  
  33.     msgpack::pack(sbuf, t);  
  34.     ofstream dumpFstream(dump_file, ios::out|ios::binary|ios::trunc);  
  35.     dumpFstream.write(sbuf.data(), sbuf.size());  
  36.     dumpFstream.close();  
  37. }  
  38.   
  39. template <class T>  
  40. void dump_to_str(T& t, char** dump_str, int& len) { //外部释放*dump_str   
  41.     msgpack::sbuffer sbuf;  
  42.     msgpack::pack(sbuf, t);  
  43.     len = sbuf.size();  
  44.     *dump_str = (char*)malloc(sbuf.size());  
  45.     memcpy(*dump_str, sbuf.data(), sbuf.size());  
  46. }  
  47.   
  48. #endif  
  • 1
  • 2
  • 下一页

相关内容