我正在使用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();
}
以下是分析运行的结果。
最佳答案
您的概要文件输出表明,要优化的第一个区域是文件读取。特别:
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()
的代码。您阅读
p1
和p2
,并立即将它们与空格连接。这是低效的:它们在输入文件中由空格分隔,并且您分别读取它们,为它们分配内存,然后将它们重新放回原处。假设三个字符串出现在输入文件的每一行中,我将这样阅读:
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()
。