标签:void ifstream memory 指针 operator ini node 释放 data
假设一个网站,最初开始压力不大,只有几千条或者几万条数据存储,约几百个查询访问
那么一般就是一台设备应对 数据输入和查询 (后继更新代码)
1

目前完成代码 链表和hash函数
#include <iostream> #include <fstream> #include "MyLink.h" // redis hash function unsigned int dictGenHashFunction(const char *buf, int len) { unsigned int hash = 5381; while (len--) hash = ((hash << 5) + hash) + (*buf++); return hash; } int main() { MyLink bucket[7]; std::ifstream infstream("OutData.dat"); std::string key, value, tmp; while (std::getline(infstream, key) && std::getline(infstream, value) && std::getline(infstream, tmp)) { unsigned int hashNum = dictGenHashFunction(key.c_str(), key.size()); bucket[hashNum % 7].AppendNode(key, value); } for (int i = 0; i < 7; i++) { std::cout << "bucket[" << i << "] has " << bucket[i].GetNodeCount() << " nodes" << std::endl; } return 0; }
#pragma once
#include <memory>
#include <string>
class MyLink {
private:
struct LinkNode {
std::string key_;
std::string value_;
std::shared_ptr<LinkNode> next_;
std::shared_ptr<LinkNode> prev_;
};
public:
MyLink() :head_(nullptr), tail_(nullptr), nodeCount_(0){}
MyLink(std::string key,std::string value){
head_ = tail_ = InitNode(key,value);
nodeCount_ = 1;
}
~MyLink() {
if (head_ == nullptr) {
return;
}
while (head_ != nullptr) {
std::shared_ptr<LinkNode> p = head_;
if (p->next_ == nullptr) {
head_ = tail_ = nullptr;
nodeCount_--;
break;
}
head_ = p->next_;
p->next_ = nullptr;
head_->prev_ = nullptr;
nodeCount_--;
}
}
size_t GetNodeCount() {return nodeCount_;}
void PrintNode() {
std::shared_ptr<LinkNode> p = head_;
for (; p != nullptr; p = p->next_) {
std::cout << p->key_ << " " << p->value_ << std::endl;
}
std::cout << std::endl;
}
std::shared_ptr<LinkNode> FindNode(const std::string key,const std::string value) {
std::shared_ptr<LinkNode> p = nullptr;
if (nullptr == tail_ || nullptr == head_) {
return p;
}
for (std::shared_ptr<LinkNode> p = head_; p != nullptr; p = p->next_) {
if (p->key_ == key && p->value_ == value )
return p;
}
return nullptr;
}
std::shared_ptr<LinkNode> FindNode(std::shared_ptr<LinkNode> node) {
std::shared_ptr<LinkNode> p = nullptr;
if (node == nullptr)
return p;
if (nullptr == tail_ || nullptr == head_) {
return p;
}
for (std::shared_ptr<LinkNode> p = head_; p != nullptr; p = p->next_) {
if (p->key_ == node->key_ && p->value_ == node->value_)
return p;
}
return nullptr;
}
bool DeleteNode(const std::string key, const std::string value) {
std::shared_ptr<LinkNode>p = FindNode(key, value);
if ( p == nullptr ) {
return false;
}
if (p->prev_ == nullptr && p->next_ == nullptr) {
head_ = tail_ = nullptr;
}else if (p->prev_ == nullptr) {
head_ = p->next_;
p->next_ = nullptr;
head_->prev_ = nullptr;
}
else if (p->next_ == nullptr) {
tail_ = p->prev_;
tail_->next_ = nullptr;
p->prev_ = nullptr;
}else {
p->prev_->next_ = p->next_;
p->next_->prev_ = p->prev_;
p->prev_ = p->next_ = nullptr;
}
nodeCount_--;
return true;
}
bool DeleteNode(std::shared_ptr<LinkNode>& node) {
std::shared_ptr<LinkNode>p = FindNode(node);
if (p == nullptr) {
return false;
}
if (p->prev_ == nullptr && p->next_ == nullptr) {
head_ = tail_ = nullptr;
}
else if (p->prev_ == nullptr) {
head_ = p->next_;
p->next_ = nullptr;
head_->prev_ = nullptr;
}
else if (p->next_ == nullptr) {
tail_ = p->prev_;
tail_->next_ = nullptr;
p->prev_ = nullptr;
}
else {
p->prev_->next_ = p->next_;
p->next_->prev_ = p->prev_;
p->prev_ = p->next_ = nullptr;
}
nodeCount_--;
return true;
}
bool AppendNode(std::string key, std::string value) {
return AppendNode(InitNode(key,value));
}
bool AppendNode(std::shared_ptr<LinkNode> node) {
bool ret = false;
if (nullptr == head_ && nullptr == tail_) {
head_ = tail_ = node;
nodeCount_++;
ret = true;
return ret;
}
else if (nullptr == tail_ || nullptr == head_) {
return ret;
}
tail_->next_ = node;
node->prev_ = tail_;
tail_ = node;
node->next_ = nullptr;
nodeCount_++;
ret = true;
return ret;
}
static std::shared_ptr<LinkNode> InitNode(const std::string& key, const std::string& value) {
std::shared_ptr<LinkNode> p(new LinkNode);
p->key_ = key;
p->value_ = value;
p->next_ = nullptr;
p->prev_ = nullptr;
return p;
}
private:
MyLink(const MyLink&);
const MyLink& operator=(const MyLink&);
size_t nodeCount_;
std::shared_ptr<LinkNode> head_;
std::shared_ptr<LinkNode> tail_;
};
整个思路就是写了一个 智能指针版的链表(注意指针间相互引用造成无法自动释放,出现内存泄漏)
然后将测试数据hash 分别放进制定数量的链表中 hash函数使用的是redis2.4版
目前来看8千数据hash分布存储5个链表 7个链表 11个链表 13个链表 还算比较均匀
测试数据如下:
5个链表存储效果
bucket[0] has 1687 nodes
bucket[1] has 1681 nodes
bucket[2] has 1658 nodes
bucket[3] has 1662 nodes
bucket[4] has 1713 nodes
7个链表存储效果
bucket[0] has 1153 nodes
bucket[1] has 1222 nodes
bucket[2] has 1195 nodes
bucket[3] has 1185 nodes
bucket[4] has 1142 nodes
bucket[5] has 1242 nodes
bucket[6] has 1262 nodes
11个链表存储效果
bucket[0] has 780 nodes
bucket[1] has 740 nodes
bucket[2] has 722 nodes
bucket[3] has 720 nodes
bucket[4] has 748 nodes
bucket[5] has 808 nodes
bucket[6] has 756 nodes
bucket[7] has 781 nodes
bucket[8] has 704 nodes
bucket[9] has 884 nodes
bucket[10] has 758 nodes
13个链表存储效果
bucket[0] has 609 nodes
bucket[1] has 630 nodes
bucket[2] has 645 nodes
bucket[3] has 644 nodes
bucket[4] has 649 nodes
bucket[5] has 682 nodes
bucket[6] has 674 nodes
bucket[7] has 591 nodes
bucket[8] has 654 nodes
bucket[9] has 646 nodes
bucket[10] has 657 nodes
bucket[11] has 632 nodes
bucket[12] has 688 nodes
37个链表存储效果
bucket[0] has 255 nodes
bucket[1] has 206 nodes
bucket[2] has 232 nodes
bucket[3] has 228 nodes
bucket[4] has 194 nodes
bucket[5] has 259 nodes
bucket[6] has 243 nodes
bucket[7] has 229 nodes
bucket[8] has 215 nodes
bucket[9] has 217 nodes
bucket[10] has 245 nodes
bucket[11] has 235 nodes
bucket[12] has 245 nodes
bucket[13] has 223 nodes
bucket[14] has 202 nodes
bucket[15] has 235 nodes
bucket[16] has 216 nodes
bucket[17] has 236 nodes
bucket[18] has 215 nodes
bucket[19] has 217 nodes
bucket[20] has 218 nodes
bucket[21] has 217 nodes
bucket[22] has 237 nodes
bucket[23] has 223 nodes
bucket[24] has 213 nodes
bucket[25] has 236 nodes
bucket[26] has 241 nodes
bucket[27] has 225 nodes
bucket[28] has 230 nodes
bucket[29] has 207 nodes
bucket[30] has 224 nodes
bucket[31] has 234 nodes
bucket[32] has 241 nodes
bucket[33] has 216 nodes
bucket[34] has 228 nodes
bucket[35] has 231 nodes
bucket[36] has 233 nodes
标签:void ifstream memory 指针 operator ini node 释放 data
原文地址:http://www.cnblogs.com/itdef/p/6254958.html