我正在使用C ++。

我的程序读取20万行文本文件,并创建一个Trie结构。

我可以保存Trie还是比现在更快?
这是从文件读取数据并构建结构的函数代码。

void buildDictionary(pTrie* root, string name) {
    wifstream r_dic;
    r_dic.imbue(locale("kor"));
    r_dic.open(name,ios::binary);
    if (r_dic.fail()) {
        cout << name << " open failed" << endl;
        exit(-1);
    }
    wchar_t wch[256];
    wstring p1, p2;
    while (r_dic >> wch >> p1 >> p2) {
        pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
        pt->addArche(wch);
    }
    r_dic.close();
}


以下是分析运行的结果。

c&#43;&#43; - 如何使用于Trie结构构建的C&#43;&#43;程序更快?-LMLPHP

最佳答案

您的概要文件输出表明,要优化的第一个区域是文件读取。特别:

wchar_t wch[256];
wstring p1, p2;
while (r_dic >> wch >> p1 >> p2) {
    pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
    pt->addArche(wch);
}


这将重复读取三个字符串。将wch读入字符数组,然后传递给splitJamo(),这将返回wstring,这需要分配内存。这可能会有点慢,但是我不能告诉您,因为您没有显示splitJamo()的代码。

您阅读p1p2,并立即将它们与空格连接。这是低效的:它们在输入文件中由空格分隔,并且您分别读取它们,为它们分配内存,然后将它们重新放回原处。

假设三个字符串出现在输入文件的每一行中,我将这样阅读:

wchar_t wch[256];
wstring p1p2;
while (r_dic >> wch && std::getline(r_dic, p1p2)) {
    pTrie* pt = root->insert(splitJamo(wch), p1p2);
    pt->addArche(wch);
}


这一起读取p1和p2,这应该是一个改进。进一步的改进可能是使用getline()一次读取整行,但是我们不能不看splitJamo()insert()的代码就知道。

还要注意,我从c_str()的第一个参数中删除了insert(),因为我认为它可能需要一个wstring,因此我们避免以这种方式构造一个新的。但是,如果需要wchar_t*,则可以放回c_str()

07-25 20:13