日期:2014-05-17  浏览次数:20723 次

求救,lucene索引大文本文件并高亮显示,内存溢出
我是想检索本地的文本文件,也就是一个文件大概有80MB左右。我索引这个文件之后 然后检索要查找的字符串并高亮显示。但是如果要高亮显示就必须在索引文件的时候处理整个文本文件的内容,这时会出现内存溢出。 

代码如下:

package newFile;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;

public class TxtFileIndexer {
public static void main(String[] args) throws Exception{

File indexDir = new File("E:\\index");
  File dataDir = new File("E:\\s"); 
  Analyzer luceneAnalyzer = new WhitespaceAnalyzer();
  File[] dataFiles = dataDir.listFiles();
  IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);
  indexWriter.setMergeFactor(200); //合并因子
  indexWriter.setMaxBufferedDocs(200); //最大缓存文档数 
  indexWriter.setMaxMergeDocs(Integer.MAX_VALUE); //最大合并文档数
  indexWriter.setMaxFieldLength(99999999);//增加内存域长度限制
   
  long startTime = new Date().getTime();
  Date startDate = new Date();
  for(int i = 0; i < dataFiles.length; i++){
  if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
  System.out.println("索引文件: " + dataFiles[i].getCanonicalPath());
  Document document = new Document();
 
  //这下面3句代码是我之前测试 一个文件大概4MB左右,有多个文件的时候可以。但是一个文件大了之后就会内存溢出。这段代码应该怎么改呢? 我调过 eclipse-->Run--->Arguments 这里面VM arguments的参数 弄成-Xms512M -Xmx1024M 了然后通过BufferedReader 一条条的读的,然后用StringBuffer把所有记录连起来。。小弟我才接触lucene不久。。有没有什么别的办法。
运行很大会了还是会内存溢出,而且会很吃内存 每运行的时候虚拟内存显示1000多 运行之后就变2000多一点了。有什么办法可以解决吗,也就是我必须要得到查询的字符串周围的记录。
  FileInputStream fis = new FileInputStream(dataFiles[i]);
  byte[] b = new byte[fis.available()];
  fis.read(b);
 
  String content = new String(b);
 
  document.add(new Field("path",dataFiles[i].getCanonicalPath(),Field.Store.YES,
  Field.Index.NO));
  document.add(new Field("content",content,Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
  indexWriter.addDocument(document);
 
  indexWriter.close();
  fis.close();
  }
  }
  indexWriter.optimize();
  indexWriter.close();
  long endTime = new Date().getTime();
  Date endDate = new Date();
  System.out.println("---"+startDate + "到" + endDate);
  System.out.println("花了 " + (endTime - startTime) 
  + " 毫秒创建索引! "
  + dataDir.getPath());  
}
}



------解决方案--------------------
关注中。。。。
------解决方案--------------------
帮你顶~
------解决方案-----------