各位:    俺最近写个程序,要对文本文件里面的指定关键字进行替换。我的处理思路是利用 CStdioFile 打开文件,依次读取每一行;每一行再去循环关键字进行替换。现在的问题是:这些关键字有 2000 多个,我放在 CStringArray 里面,每读取一行就要循环 2000 多次,效率不是很高。虽然采用了多线程,但是还是经常造成线程假死,各位有什么好办法么?
    谢谢!

解决方案 »

  1.   

    CMap<int, int, CString, CString> mapKeywordsMap;
    呵呵,试过了,不过这个 map 太大了,2000 多行,即使是个空的,
    啥都不做,仅仅 Sleep(1) 也要好久。
    唉,郁闷
    for (int i = 0; i < mapKeywordsMap.GetSize(); i++)
    {
        //其他的事情
        Sleep(1);
    }
      

  2.   

    好像lz对akirya的回答理解有误,CMap的定义应该是
    CMap<CString,CString,bool,bool>
    因为这样才能利用CMap对关键词的排序搜索加速.如果lz真的要提高效率,建议采用双层map(对不起,我一般都用stl的map,对CMAP基本没用过)
    将关键词的第一个汉字或字符放入第一层map,其值是二层map,因为关键词不会经常动态变化,在数量较大的情况下应该可以提高速度.
    可以定义为:
    std::map<wstring,std::map<wstring,bool> >
    还有一个建议,文件可以一次读入,然后在内存中分析,每次读一行对IO是一种浪费
      

  3.   

    多线程的处理,我觉得应该放在对来源分析上,而不是对关键词的定位上你可以将读入的10000行文本,分成5个线程,每个线程负责处理2000行,由于行间没有替换依赖关系,可独立查找替换,因此适用多线程.由于关键词map可以作为一次建立,然后以常量查找的方式使用,stl的map是线程安全的,可以在多个线程中安全常量式使用同一个关键词双层map还有引入map的好处就是为了利用其关键词查找算法,因为for循环是不应该使用的,应该用map的find(关键词)的方式