10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

75 lignes
1.5 KiB

  1. #include "leveldb/db.h"
  2. #include "leveldb/filter_policy.h"
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <ctime>
  6. using namespace leveldb;
  7. constexpr int value_size = 2048;
  8. constexpr int data_size = 256 << 20;
  9. // 3. 数据管理(Manifest/创建/恢复数据库)
  10. Status OpenDB(std::string dbName, DB **db) {
  11. Options options;
  12. options.create_if_missing = true;
  13. options.filter_policy = NewBloomFilterPolicy(10);
  14. return DB::Open(options, dbName, db);
  15. }
  16. // 1. 存储(数据结构与写入)
  17. // 4. 数据合并(Compaction)
  18. void InsertData(DB *db) {
  19. WriteOptions writeOptions;
  20. int key_num = data_size / value_size;
  21. srand(0);
  22. for (int i = 0; i < key_num; i++) {
  23. int key_ = rand() % key_num+1;
  24. std::string key = std::to_string(key_);
  25. std::string value(value_size, 'a');
  26. db->Put(writeOptions, key, value);
  27. }
  28. }
  29. // 2. 数据访问(如何读数据)
  30. void GetData(DB *db, int size = (1 << 30)) {
  31. ReadOptions readOptions;
  32. int key_num = data_size / value_size;
  33. // 点查
  34. srand(0);
  35. for (int i = 0; i < 100; i++) {
  36. int key_ = rand() % key_num+1;
  37. std::string key = std::to_string(key_);
  38. std::string value;
  39. db->Get(readOptions, key, &value);
  40. }
  41. // 范围查询
  42. Iterator *iter = db->NewIterator(readOptions);
  43. iter->SeekToFirst();
  44. while (iter->Valid()) {
  45. iter->Next();
  46. }
  47. delete iter;
  48. }
  49. int main() {
  50. DB *db;
  51. if(OpenDB("testdb", &db).ok()) {
  52. InsertData(db);
  53. delete db;
  54. }
  55. if(OpenDB("testdb", &db).ok()) {
  56. GetData(db);
  57. delete db;
  58. }
  59. DestroyDB("testdb",Options());
  60. return 0;
  61. }