歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> msgpack[C++]使用筆記 和 msgpack/cPickle性能對比

msgpack[C++]使用筆記 和 msgpack/cPickle性能對比

日期:2017/3/1 10:25:48   编辑:Linux編程

python版本的msgpack非常好用,速度上比python內置的pickle和cpickle都要快一些,C++版本的使用比較麻煩,下面是本人學習時的一個example,解析python-msgpack dump的一個復雜字典。

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

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


下面是本人自己封裝的一個msgpack接口頭文件mymsgpack.h

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