From e76bdbd436d3c835092ea3e940a5795f19418902 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Mon, 4 Dec 2023 08:14:27 +0000 Subject: [PATCH] upd: optimize database --- backend/include/drivearray.hpp | 40 ++++++++++++++++++---------------- backend/include/key2index.hpp | 16 +++++++++++--- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/backend/include/drivearray.hpp b/backend/include/drivearray.hpp index 265a578..a0ae3a1 100644 --- a/backend/include/drivearray.hpp +++ b/backend/include/drivearray.hpp @@ -41,33 +41,35 @@ class DriveArray { virtual_mem = mmap(nullptr, file_length, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0); } - void ForceRefresh() noexcept { - munmap(virtual_mem, file_length); - virtual_mem = mmap(nullptr, file_length, PROT_READ | PROT_WRITE, MAP_SHARED, - file_descriptor, 0); - } public: DriveArray() = default; inline bool IsOpen() const noexcept { return file_descriptor >= 0; } ~DriveArray() { - reallocate(true); - int stk_data_begin = - raw_data_begin + - (sizeofT * total_mem + kPageSize - 1) / kPageSize * kPageSize; - *((int *)(virtual_mem) + info_len) = total_mem; - *((int *)(virtual_mem) + info_len + 1) = (int)free_mem.size(); - int *p = (int *)(virtual_mem + stk_data_begin); - while (!free_mem.empty()) { - *(p++) = free_mem.top(); - free_mem.pop(); + if (file_descriptor >= 0) { + reallocate(true); + int stk_data_begin = + raw_data_begin + + (sizeofT * total_mem + kPageSize - 1) / kPageSize * kPageSize; + *((int *)(virtual_mem) + info_len) = total_mem; + *((int *)(virtual_mem) + info_len + 1) = (int)free_mem.size(); + int *p = (int *)(virtual_mem + stk_data_begin); + while (!free_mem.empty()) { + *(p++) = free_mem.top(); + free_mem.pop(); + } + munmap(virtual_mem, file_length); + close(file_descriptor); + file_descriptor = -1; } - munmap(virtual_mem, file_length); - close(file_descriptor); - file_descriptor = -1; } bool operator=(const DriveArray &) = delete; - + void ForceRefresh() noexcept { + munmap(virtual_mem, file_length); + virtual_mem = mmap(nullptr, file_length, PROT_READ | PROT_WRITE, MAP_SHARED, + file_descriptor, 0); + } + void *RawData() noexcept { return virtual_mem; } void OpenFile(const std::string &file_name) { if (file_name == "") return; if (file_descriptor >= 0) { diff --git a/backend/include/key2index.hpp b/backend/include/key2index.hpp index 49c39e9..4e30ab2 100644 --- a/backend/include/key2index.hpp +++ b/backend/include/key2index.hpp @@ -57,7 +57,12 @@ class String2Index { mem.OpenFile(file_name); delete[] hash_table; hash_table = new int[kBucketSize]; - for (int i = 0; i < kBucketSize; ++i) mem.get_info(hash_table[i], i + 1); + // std::memmove(hash_table, mem.RawData(), sizeof(int) * kBucketSize); + // mem.ForceRefresh(); + for (int i = 0; i < kBucketSize; i++) { + hash_table[i] = *((int *)(mem.RawData()) + i); + if (i % 4096 == 0) mem.ForceRefresh(); + } } String2Index(const std::string __file_name) : file_name(__file_name) { OpenFile(file_name); @@ -72,8 +77,13 @@ class String2Index { hash_table = new int[kBucketSize](); } ~String2Index() { - for (int i = 0; i < kBucketSize; ++i) mem.write_info(hash_table[i], i + 1); - delete[] hash_table; + if (hash_table != nullptr) { + for (int i = 0; i < kBucketSize; i++) { + *((int *)(mem.RawData()) + i) = hash_table[i]; + if (i % 4096 == 0) mem.ForceRefresh(); + } + delete[] hash_table; + } } void Insert(const std::string &str, int val) noexcept { size_t hash_val = Hash(str);