0

我致力于使用可扩展哈希来更快地找到查询。我的代码是这个步骤:1)读取主文本文件(hudge文件4 GiB)文件是这样的:

12435 alex romero
13452 jack robert
13485 marya car
45132 gun tribble
...

用户想知道例如密钥 12435 与什么有关?(答案:alex romero)

2)为文件中的键创建一个哈希表(我的意思是12435,13452,13485,...),我将此表动态保存在硬盘中一些名为:0.txt,1.txt,2的文本文件中。 txt 和....

3)当用户对程序进行查询时,程序必须对其值计算散列函数并找到必须读取的文件,这样才能更快地找到结果。

我有一个功能:

#define LIMIT 7
void writeInFile(int key , const char* charPos ){
    int remainder = key%(LIMIT*LIMIT);

    string myFileName;
    ostringstream convert;
    convert << remainder ;

    myFileName = convert.str();
    myFileName += ".txt";

    FILE *my_file;
    my_file = fopen(myFileName.c_str() ,"a");

    fputs("\n" ,my_file);
    fputs(charPos , my_file);
    //fclose(my_file);
}

我想知道当我使用时fclose程序的速度会降低!然后我不在函数末尾使用它,但一个问题是当我多次使用此函数时我无法关闭它们然后我无法访问文件。我想创建一个文件的“列表”,我可以将它们的引用发送给函数,例如:FILE &* myFiles[]FILE &** myFiles作为函数获取的第三个参数......但我看到了错误。我不知道它的语法如何。我的意思是一些语法,如:

void writeInFile(int key , const char* charPos , FILE &*myFiles[] ) // this makes error

我认为的另一种方法是我可以关闭那些现在无法访问的文件吗?或者我可以更改导致此问题的代码吗?

更新:这是我的完整代码

#include <iostream>
#include <fstream>
#include <limits>
#include <string>
#include <sstream>
#include <stdio.h>
#include <vector>

#define LIMIT 7

using namespace std;

void writeInFile(int key , const char* charPos ){
    int remainder = key%(LIMIT*LIMIT);

    string myFileName;
    ostringstream convert;
    convert << remainder ;

    myFileName = convert.str();
    myFileName += ".txt";

    FILE *my_file;
    my_file = fopen(myFileName.c_str() ,"a");

    fputs("\n" ,my_file);
    fputs(charPos ,my_file);
    //fclose(my_file);

}

int main(){
    string fileName;
    cout << "hello, please inter your file destination : " ;
    cin >> fileName;
    ifstream myFile ;
    myFile.open(fileName.c_str() ,ifstream::in |ifstream::binary);
    cout << "building the hash,please wait";
    string havij;//:D this is an unusable variable in this section :))
    int current;
    int index;
    int isCout=0;
    char buffer [10];

    //FILE *my_file[49];
    while(!myFile.eof()){

        cout << isCout << endl;
        isCout++;
        index = myFile.tellg();


        itoa(index , buffer ,10);
        //cout << buffer << endl;
        myFile >> current;
        writeInFile(current ,buffer);
        getline(myFile,havij);
    }
    myFile.close();
    fstream test;
    //for(int i =0 ; i<LIMIT*LIMIT-1 ; i++){
    //  fclose(my_file[i]);
    //}
    cout << endl << "static extensible hash structure builded please inter your query : " ;
    int query;
    cin >> query;
    int remainder = query%(LIMIT*LIMIT);

    string myFileName;
    ostringstream convert;
    convert << remainder ;

    myFileName = convert.str();
    myFileName += ".txt";

    ifstream myFile2;
    //myFile2 is now the files that create by program like : 12.txt ,25.txt ,....
    myFile2.open(myFileName.c_str() , ifstream::in | ifstream::binary);
    ifstream mainFile;
    mainFile.open(fileName.c_str(), ifstream::in | ifstream::binary);
    int position;
    string wanted;
    int tester;
    while(!myFile2.eof()){
        myFile2 >> position;

        mainFile.seekg(position ,ios::beg);
        mainFile >> tester;
        if (tester == query ){
            getline(mainFile ,wanted);
            cout << "the result of the key " << tester << " is  " << wanted << endl;
        }
    }
    return 0;
}
4

3 回答 3

0

或者你可以这样做:

void writeInFile(int key , const char* charPos , std::vector<std::ofstream> & myFiles );

我发现这可以减少我的大脑受到的伤害。

于 2012-05-24T15:59:51.037 回答
0

如果您不在声明 FILE* 变量的同一上下文中关闭文件,则您正在泄漏该文件描述符。在某些时候,您将耗尽资源,程序将崩溃。

由于您使用的是您展示的代码段中的 C++,那么使用 std::vector 和 std::ofstream 会更好。

void writeInFile(int key, const char* charPos, std::vector<std::ofstream> my_files )
于 2012-05-24T16:11:07.597 回答
0

如前所述,您应该在打开的范围内关闭文件。这是 C++ 流的默认行为。

但是,这并不意味着您应该为添加的每个单词打开/关闭!只要您有要添加的内容,您写入的文件就应该保持打开状态(请注意操作系统可以处理的文件描述符数量有限制)。

因此,您应该:

  1. 打开所有目标文件 (*)
  2. 对于每一行,在表格/地图中选择适当的文件并写入其中
  3. 关闭所有目​​标文件

(*) 如前所述,您可能会遇到硬限制,在这种情况下,您无能为力,如果您的散列函数有价值,则缓存不太可能有效。一种可能性是对大文件进行多次运行,并在每次运行时仅保存一部分哈希(例如运行 1:[0-9] 中的哈希,运行 2:[10-19] 中的哈希,... )。

基本类型FILE*ofstream您使用的基本类型无关紧要,两者都具有相当的速度(正确调整)。

于 2012-05-24T16:11:30.990 回答