1

これは、コード内で実行が非常に遅い 2 つの関数です。基本的に、ドキュメント名を読み込んでドキュメントを開き、一度に 1 単語ずつ処理します。ドキュメントを複数の文に分割し、各文にその単語が文中に出現する回数を表すハッシュ テーブルを与える必要があります。また、すべての新しい単語と、ドキュメント全体のハッシュ テーブルを追跡する必要があります。

合計 8000 ワード、2100 の一意のワードを持つ 10 個のドキュメントでコードを実行すると、実行に約 8000 秒以上かかります... ワードごとにほぼ 1 秒かかります。

どのくらい時間がかかるか教えてもらえますif(istream.good())か?

または、何が私のコードを遅らせているかがわかれば。セクションが明確でない場合はお知らせください。お手伝いします。

PSあなたは私が持っているコードで見ることができ、start = clock()それend = clock()は常に<1ミリ秒を返します。そして、それは気が遠くなるようなものです

void  DocProcess::indexString(string sentenceString, hash * sent){

stringstream iss;

string word;
iss.clear();
iss << sentenceString;

while(iss.good())
{

    iss >> word;
    word = formatWord(word);

    std::unordered_map<std::string,int>::const_iterator IsNewWord = words.find(word);

    if(IsNewWord == words.end())
    {
        std::pair<std::string,int> newWordPair (word,0);
        std::pair<std::string,int> newWordPairPlusOne (word,1);

        words.insert(newWordPair);
        sent->insert(newWordPairPlusOne);
    }
    else
    {
        std::pair<std::string,int> newWordPairPlusOne (word,1);
        sent->insert(newWordPairPlusOne);
    }
}

} void DocProcess::indexFile(string iFileName){

hash newDocHash;
hash newSentHash;
scoreAndInfo sentenceScore;
scoreAndInfo dummy;

fstream iFile;
fstream dFile;
string word;
string newDoc;
string fullDoc;
int minSentenceLength = 5;
int docNumber = 1;
int runningLength = 0;
int ProcessedWords = 0;
stringstream iss;

iFile.open(iFileName.c_str());

if(iFile.is_open())
{
    while(iFile.good())
    {
        iFile >> newDoc;
        dFile.open(newDoc.c_str());
        DocNames.push_back(newDoc);

        if(dFile.is_open())
        {
            scoreAndInfo documentScore;
            //iss << dFile.rdbuf();
            while(dFile.good())
            {
                //start = clock();
                dFile >> word;
                ++ProcessedWords;

                std::unordered_map<std::string,int>::const_iterator IsStopWord = stopWords.find(word);


                if(runningLength >= minSentenceLength && IsStopWord != stopWords.end() || word[word.length()-1] == '.')
                {

                    /* word is in the stop list, process the string*/
                    documentScore.second.second.append(" "+word);
                    sentenceScore.second.second.append(" "+word);

                    indexString(sentenceScore.second.second, &sentenceScore.second.first);

                    sentenceScore.first=0.0;
                    SentList.push_back(sentenceScore);
                    sentenceScore.second.first.clear(); //Clear hash
                    sentenceScore.second.second.clear(); // clear string
                    //sentenceScore = dummy;
                    runningLength = 0;
                }
                else
                {
                    ++runningLength;
                    sentenceScore.second.second.append(" "+word);
                    documentScore.second.second.append(" "+word);

                }
                //end = clock();
                    system("cls");
                    cout    << "Processing doc number: " << docNumber << endl
                        << "New Word count: " << words.size() << endl
                        << "Total words: " << ProcessedWords << endl;
                        //<< "Last process time****: " << double(diffclock(end,start)) << " ms"<< endl;

            }
            indexString(documentScore.second.second, &documentScore.second.first);
            documentScore.first=0.0;
            DocList.push_back(documentScore);
            dFile.close();
            //iss.clear();
            //documentScore = dummy;
            ++docNumber;
            //end = clock();
            system("cls");
            cout    << "Processing doc number: " << docNumber << endl
                << "Word count: " << words.size();
                //<< "Last process time: " << double(diffclock(end,start)) << " ms"<< endl;

        }
    }

    iFile.close();
}
else{ cout << "Unable to open index file: "<<endl <<iFileName << endl;}

} `

4

2 に答える 2

0

画面をすばやくクリアするには、 の代わりにsystem("cls");を試してくださいcout << '\f';

于 2013-03-06T00:52:52.277 に答える