我用vector做一个bloom filter,需要把生成的过滤器持久化到文件,再从文件恢复到内存。但在这个环节遇到了问题。
我写了以下把vetor bit_table_ 内容写入文件,以及从文件重载回内存的两个函数,但装载后的内容与实际内容是不一样的,以致不能通过bloom filter的检测。
#2021-12-06晚间更新:
通过网上查资料,自己琢磨测试,找到了一种方法能勉强解决上述问题。但有一个地方的写法有点蠢:其中反序列化装载函数的实现,先从文件把内容读入一个临时vector,再swap到类成员变量的写法实在是很LOW,特别是对于巨大的,非常耗内存的大型bloom filter,这种写法要占用双倍的内存,非常不可取。但我这种C++新手,一时半会又找不到更好且可行的写法,还请各路大神继续帮助,给出更好的实现方法。
详见下文回复内容。
#----------------------------------
//把过滤器内存持久化到文件
inline bool dump_tofile(string filename)
{
ofstream fout(filename.c_str(), ios::binary);
if(fout.is_open()==false)
{
std::cout<<"Open file:" << filename <<" fail!"<<std::endl;
return false;
}
std::vector<bool>::size_type n = bit_table_.size();
fout.write((const char*)&n, sizeof(std::vector<bool>::size_type));
for(std::vector<bool>::size_type i = 0; i < n;)
{
unsigned char aggr = 0;
for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
if(bit_table_.at(i))
aggr |= mask;
fout.write((const char*)&aggr, sizeof(unsigned char));
}
fout.close();
std::cout << "已把"<< n/(1024*1024) <<" MB 的过滤器内容保存到文件:"<< filename << std::endl;
return true;
}
//从文件中加载过滤器
inline bool load_fromfile(string filename)
{
ifstream fin(filename.c_str(), ios::binary);
if(fin.is_open()==false)
{
std::cout<<"Open file:" << filename <<" fail!"<<std::endl;
return false;
}
std::vector<bool>::size_type n;
fin.read((char*)&n, sizeof(std::vector<bool>::size_type));
bit_table_.resize(n);
for(std::vector<bool>::size_type i = 0; i < n;)
{
unsigned char aggr;
fin.read((char*)&aggr, sizeof(unsigned char));
for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
bit_table_.at(i) = aggr & mask;
}
fin.close();
std::cout << "已把"<< n/(1024*1024) <<" MB 的过滤器从文件:"<< filename << "装载到内存。" << std::endl;
}
求大神指导