我用lucene做索引用,因为文件比较多有1600个pdf文件,大约有总大小有1.56G,可是每当索引到300多个文件时也就是大约.cfs文件为344M大小的时候,就出现这个问题: 
2008-7-1 13:18:40 org.apache.catalina.core.StandardWrapperValve invoke 
严重: Servlet.service() for servlet SearchController threw exception 
java.lang.OutOfMemoryError: Java heap space 
使用的电脑是2G内存,indexWriter的三个参数采用的是默认设置,我试了三次每次都是在cfs文件在344M的时候出这个问题,这是我写的循环有什么问题 
try 

Directory fsDirectory = FSDirectory.getDirectory(indexDir, true); 
MMAnalyzer analyzer = new MMAnalyzer(); 
indexWriter = new IndexWriter(fsDirectory, analyzer, true); 
LinkedList <File> list = new LinkedList <File>(); 
File file[] = dir.listFiles(); 
for (int i = 0; i < file.length; i++) 

if (file[i].isDirectory()) 
list.add(file[i]); 
else 

if (file[i].getName().indexOf(type) != -1) 

Document doc = getDocument(file[i], indexDir); 
System.out.println("正在建立索引 : " + file[i] + ""); 
indexWriter.addDocument(doc); 

// System.out.println("索引建立完毕!"); 


File tmp; 
while (!list.isEmpty()) 

tmp = list.removeFirst(); 
if (tmp.isDirectory()) 

file = tmp.listFiles(); 
if (file == null) 
continue; 
for (int i = 0; i < file.length; i++) 

if (file[i].isDirectory()) 
list.add(file[i]); 
else 

if (file[i].getName().indexOf(type) != -1) 

Document doc = getDocument(file[i], indexDir); 
System.out.println("正在建立索引 : " + file[i] + ""); 
indexWriter.addDocument(doc); 

// System.out.println("索引建立完毕!"); 



else 

System.out.println(tmp.getAbsolutePath()); 



catch (IOException e) 

// TODO Auto-generated catch block 
e.printStackTrace(); 

catch (Exception e) 

// TODO Auto-generated catch block 
e.printStackTrace(); 

finally 

try 

indexWriter.optimize(); 
indexWriter.close(); 
indexWriter=null; 

catch (IOException e) 

// TODO Auto-generated catch block 
e.printStackTrace(); 

System.gc(); 

return true; 
}
还有是SearchController的问题吗?这个是SearchController文件:
public class SearchController extends HttpServlet
{ private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) {
try
{
String searchWord = request.getParameter("searchWord");
String patentsearch = request.getParameter("search");
String searchtype = request.getParameter("searchtype");
SearchManager searchManager = new SearchManager(searchWord, patentsearch, searchtype);
List<SearchResultBean> searchResult = null;
searchResult = searchManager.search();
RequestDispatcher dispatcher = request.getRequestDispatcher("search.jsp");
request.setAttribute("searchResult", searchResult);
dispatcher.forward(request, response);
}
catch (ServletException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
{
doPost(request, response);
}
}

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhuyedeqingqing】截止到2008-07-06 14:26:21的历史汇总数据(不包括此帖):
    发帖的总数量:7                        发帖的总分数:300                      
    结贴的总数量:4                        结贴的总分数:240                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:3                        未结的总分数:60                       
    结贴的百分比:57.14 %               结分的百分比:80.00 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    给你一个垃圾做法。
    把1600个文件分成10组,每次索引160个,外部循环。记得,每次做完要关闭Index.如果还不行,我也没办法了。这么大的文件,没遇到过。
      

  3.   

    334M,难道有Index的最大限制?好像测试的时候,Lucene是默认主流内存的。也许超过了他最大允许的内存。
      

  4.   

    是不是你的myEclipse内存溢出了呀,给MyEclipse增加内存