程序主函数如下:
public static void main(String[] args) throws Exception
 {

 HashSet dict=new HashSet();
 HashMap docMap=new HashMap();
 HashMap contTerms=new HashMap();
 dict=readdict("E:\\dict.txt",dict);//词典读入
 int count=0;
 StringBuffer cont=new StringBuffer();
 docMap=fileList("E:\\2006",docMap);
 writeConfig(docMap);
 
 StringBuffer sb=new StringBuffer("");
 StringBuffer content=new StringBuffer("");
 String did=new String("");
 String filename=new String("");
 
Iterator dit=docMap.keySet().iterator();
long startTime=System.currentTimeMillis();
while(dit.hasNext())
{
did=dit.next().toString();
filename=docMap.get(did).toString();
content=readFile(filename);//读入文件内容
sb=delTag("script",content);//去除文件某些内容
content=readHtml(cont,sb);//提取某些内容
contTerms=parserWord(did,content,dict,contTerms);//对正文进行分词统计
System.out.println("prossing:"+count);
count++;
}
long endTime=System.currentTimeMillis();
writeIndex(contTerms);
System.out.println("alltime:"+(endTime-startTime));
System.out.println("total:"+count);
System.out.println("indexNum:"+contTerms.size()); 
 }
}我在做循环时,处理前100个文件速度还可以,但是到后面速度就很慢了,不知道如何提高效率呢?
有什么方法呢?初学ing望大虾们指导下。。

解决方案 »

  1.   

    把问题细化一下,感觉你下面的每个方法都有可能慢,最好找到具体是哪个方法慢引起的慢。 
    content=readFile(filename);//读入文件内容
    sb=delTag("script",content);//去除文件某些内容
    content=readHtml(cont,sb);//提取某些内容
    contTerms=parserWord(did,content,dict,contTerms);//对正文进行分词统计
      

  2.   

    这个一般的文件读入有200多的毫秒
    最多时间是它了这还可以优化??public static StringBuffer readFile(String szFileName )//文件读入函数
    {
         int i=0;
            try {
                BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE) );
                StringBuffer szContent=new StringBuffer();
                String szTemp;
                
                while ( (szTemp = bis.readLine()) != null) {
                    i++;
                    if(i>=8)//去掉文件里开头9行内容
                    {
                     szContent.append(szTemp);
                    }
                }
                bis.close();
                return szContent;
            }
            catch( Exception e ) {
             System.out.println("read text error!- -!");
                return null;
            }
        }
      

  3.   

    contTerms=parserWord(did,content,dict,contTerms);//对正文进行分词统计
    你每处理一个文件,对这个map的内容清空了吗?
      

  4.   

    contTerms是我要记录下来的内容啊。
    我要全部都要记下来的。
      

  5.   

    {
                did=dit.next().toString();
                filename=docMap.get(did).toString();
                content=readFile(filename);//读入文件内容
                sb=delTag("script",content);//去除文件某些内容
                content=readHtml(cont,sb);//提取某些内容
                contTerms=parserWord(did,content,dict,contTerms);//对正文进行分词统计
                System.out.println("prossing:"+count);
                count++;
            }这一段可以优化。
    比如,did=dit.next().toString(),每一次循环,都把did原来所指向的串丢掉交给了垃圾回收机,而垃圾回收机不到万不得已不会回收垃圾,即使回收也是要花cpu时间的。所以这句改为did.append(docMap.get(did).toString()),而在contTerms=parserWord(did,content,dict,contTerms);之后再执行did.delete(0,did.length())清空did中的字符。对content,和sb也应该做类似的改进。而deltag(),readFile(),parseWord()三个方法中估计也有类似的问题。另外,stringBuilder和stringBuffer功能一样,但stringBuilder更快一些。