doc: 减少了drivearray的IO次数

This commit is contained in:
2023-12-06 00:46:48 +00:00
parent 68de72efb0
commit 58a71c55b4

View File

@ -25,7 +25,7 @@ class DriveArray {
struct BlockType { struct BlockType {
DataType data[kDataPerBlock]; DataType data[kDataPerBlock];
}; };
char rest[kBlockSize - sizeof(BlockType)]; char rest[kBlockSize];
static_assert(kBlockSize % kPageSize == 0, "kBlockSize % kPageSize != 0"); static_assert(kBlockSize % kPageSize == 0, "kBlockSize % kPageSize != 0");
std::string file_name; std::string file_name;
int total_block_number = 0, first_vacant_data_index = 0; int total_block_number = 0, first_vacant_data_index = 0;
@ -56,11 +56,15 @@ class DriveArray {
return cache[block_index]; return cache[block_index];
} }
int AppEndBlock() { int AppEndBlock() {
if (cache.size() == kBufSize) ReleaseOldestCache();
BlockType *tmp = new BlockType;
// fs.write(reinterpret_cast<char *>(tmp), sizeof(BlockType));
// fs.write(rest, kBlockSize - sizeof(BlockType));
fs.seekp(0, std::ios::end); fs.seekp(0, std::ios::end);
BlockType tmp; fs.write(rest, kBlockSize);
fs.write(reinterpret_cast<char *>(&tmp), sizeof(BlockType));
fs.write(rest, kBlockSize - sizeof(BlockType));
++total_block_number; ++total_block_number;
cache[total_block_number] = tmp;
vis_que.push(total_block_number);
return total_block_number; return total_block_number;
} }
@ -161,7 +165,8 @@ class DriveArray {
blk_ptr->data[i].next_vacant_data_index = index + i + 1; blk_ptr->data[i].next_vacant_data_index = index + i + 1;
blk_ptr->data[kDataPerBlock - 1].next_vacant_data_index = 0; blk_ptr->data[kDataPerBlock - 1].next_vacant_data_index = 0;
blk_ptr->data[0].next_vacant_data_index = 0; blk_ptr->data[0].next_vacant_data_index = 0;
blk_ptr->data[0].val = t; // blk_ptr->data[0].val = t;
std::memmove(&blk_ptr->data[0].val, &t, sizeofT);
return index; return index;
} else { } else {
int block_index = (first_vacant_data_index - 1) / kDataPerBlock + 1; int block_index = (first_vacant_data_index - 1) / kDataPerBlock + 1;
@ -171,7 +176,8 @@ class DriveArray {
first_vacant_data_index = first_vacant_data_index =
blk_ptr->data[inner_index - 1].next_vacant_data_index; blk_ptr->data[inner_index - 1].next_vacant_data_index;
blk_ptr->data[inner_index - 1].next_vacant_data_index = 0; blk_ptr->data[inner_index - 1].next_vacant_data_index = 0;
blk_ptr->data[inner_index - 1].val = t; // blk_ptr->data[inner_index - 1].val = t;
std::memmove(&blk_ptr->data[inner_index - 1].val, &t, sizeofT);
return index; return index;
} }
} }
@ -180,14 +186,16 @@ class DriveArray {
int block_index = (index - 1) / kDataPerBlock + 1; int block_index = (index - 1) / kDataPerBlock + 1;
int inner_index = (index - 1) % kDataPerBlock + 1; int inner_index = (index - 1) % kDataPerBlock + 1;
BlockType *blk_ptr = OrderBlock(block_index); BlockType *blk_ptr = OrderBlock(block_index);
blk_ptr->data[inner_index - 1].val = t; // blk_ptr->data[inner_index - 1].val = t;
std::memmove(&blk_ptr->data[inner_index - 1].val, &t, sizeofT);
} }
void read(T &t, const int index) noexcept { void read(T &t, const int index) noexcept {
int block_index = (index - 1) / kDataPerBlock + 1; int block_index = (index - 1) / kDataPerBlock + 1;
int inner_index = (index - 1) % kDataPerBlock + 1; int inner_index = (index - 1) % kDataPerBlock + 1;
BlockType *blk_ptr = OrderBlock(block_index); BlockType *blk_ptr = OrderBlock(block_index);
t = blk_ptr->data[inner_index - 1].val; // t = blk_ptr->data[inner_index - 1].val;
std::memmove(&t, &blk_ptr->data[inner_index - 1].val, sizeofT);
} }
void Delete(int index) noexcept { void Delete(int index) noexcept {