C++ C++;二进制文件I/O操作速度减慢。。。数据库如何处理二进制文件?
我正在尝试制作一个简单的基于文件的哈希表。这是我的C++ C++;二进制文件I/O操作速度减慢。。。数据库如何处理二进制文件?,c++,fstream,binaryfiles,c++-ios,C++,Fstream,Binaryfiles,C++ Ios,我正在尝试制作一个简单的基于文件的哈希表。这是我的insert成员函数: private: std::fstream f; // std::ios::in | std::ios::out | std::ios::binary public: void insert(const char* this_key, long this_value) { char* that_key; long that_value; long this_hash = std::hash<
insert
成员函数:
private: std::fstream f; // std::ios::in | std::ios::out | std::ios::binary
public: void insert(const char* this_key, long this_value) {
char* that_key;
long that_value;
long this_hash = std::hash<std::string>{}(this_key) % M;
long that_hash; // also block status
long block = this_hash;
long offset = block * BLOCK_SIZE;
while (true) {
this->f.seekg(offset);
this->f.read((char*) &that_hash, sizeof(long));
if (that_hash > -1) { // -1 (by default) indicates a never allocated block
this->f.read(that_key, BLOCK_SIZE);
if (strcmp(this_key, that_key) == 0) {
this->f.seekp(this->f.tellg());
this->f.write((char*) &this_value, sizeof(long));
break;
} else {
block = (block + 1) % M; // linear probing
offset = block * BLOCK_SIZE;
continue;
}
} else {
this->f.seekp(offset);
this->f.write((char*) &this_hash, sizeof(long)); // as block status
this->f.write(this_key, KEY_SIZE);
this->f.write((char*) &this_value, sizeof(long));
break;
}
}
}
private:std::fstream f;//std::ios::in | std::ios::out | std::ios::binary
public:void insert(常量字符*此_键,长此_值){
char*那把钥匙;
长时间使用该值;
long this_hash=std::hash{}(this_key)%M;
long表示_hash;//还包括块状态
长块=这个散列;
长偏移=块*块大小;
while(true){
此->f.seekg(偏移量);
this->f.read((char*)&that_散列,sizeof(long));
if(that_hash>-1){/-1(默认情况下)表示从未分配的块
此->f.read(该键,块大小);
if(strcmp(这个密钥,那个密钥)==0){
this->f.seekp(this->f.tellg());
this->f.write((char*)&this_值,sizeof(long));
打破
}否则{
block=(block+1)%M;//线性探测
偏移=块*块大小;
继续;
}
}否则{
此->f.seekp(偏移量);
this->f.write((char*)&this_hash,sizeof(long));//作为块状态
此->f.写入(此键,键大小);
this->f.write((char*)&this_值,sizeof(long));
打破
}
}
}
测试了多达10米的键、值对和50000017个块。(二进制文件大小约为3.8GB)
然而,使用50米键和250000013个块的测试速度非常慢。。。(在本例中,二进制文件大小超过19GB)。1000insert
s通常需要4~5ms,但异常情况下需要超过2000ms。它变得越来越慢,然后需要40~150毫秒。。。(x10~x30较慢…)我绝对不知道
- 是什么导致此异常二进制文件I/O速度减慢
- 文件大小是否会影响
&seekg
和其他I/O操作?(但我找不到关于这个问题的任何参考资料…)seekp
- 键、值存储和数据库如何避免这种I/O速度减慢
- 我怎样才能解决这个问题
- 额外RAM
- 快速固态硬盘
- 多线程(例如输入和输出线程)
- 重写算法(例如,一次读取/写入整个磁盘页)
- 更快的CPU/64位计算机
- 使用针对此类场景设计的算法
- 使用数据库
- 分析代码
- 调谐参数