一次查询出100条,一次保存到lucene(你上边写一条就要打开关闭一次lucene当然慢了).然后清空内存.
然后在查询下100条.在一次保存到lucene..........................
和读大文件原理一样

解决方案 »

  1.   

    从 LZ 给出的程序里,我没看到“生成一个暂时的索引文件a,然后把a加到b中”,只看到了“遍历一个 ts,对每条记录生成一个 Map,把字段值放在 Map 中,再调用一个方法把 Map 里的值取出来,放到一个 Document 对象中,再写到一个新生成的 IndexWriter 里面去”。我觉得你遇到的性能问题,关键在于“每次创建一个新的 IndexWriter 对象”。随着索引的内容越来越多,创建一个 IndexWriter 对象的开销也会越来越大的。完全没有必要这样做嘛,创建一个 IndexWriter 对象,从头用到尾,直到把所有的 Document 都写进去,很简单的。至于你一开始说的“把一个表的数据一次性全部处理,很显然出现内存溢出”,应该可以用 server-side cursor 解决吧……
      

  2.   

    多些各位了,呵呵!我写的的确不对,前天突然想到了这里面的毛病在那里,就像maquan所说的那样 创建的IndexWriter越来越多,而且因为大小写不统一导致生成的索引文件更本没有用,怎么也查不出来后来把大小写改好后又把方法   writerIndex改了,之前是返回FSDirectory (消耗资源),或来就改为Document,看一下改后的程序:
      public   class   ResultIndexDao   { /** 
      *   @param   args 
      */ 
    public   static   void   main(String   arg[])   { 
    ConnectionOracle   ts=null; try{ FSDirectory   directory   =   FSDirectory.getDirectory( "D:\\eclipse   3.2\\JavaScape\\HXAIC\\Index\\Index "); 
    IndexWriter   writer   =   new   IndexWriter(directory,   getAnalyzer(),   true); int   i=0;int   j=0;int   m=0; 
    while(rs.next()) 

    HashMap   hap=new   HashMap(); 
    hap.put( "fbz ",   rs.getString( "fBZ ")); 
    Document doc=writerIndex(hap);
    writer.addDocument(doc);
    hap=null; 

    writer.optimize(); 
    writer.close(); ts.transactionCommit(false); }catch(Exception   e){e.printStackTrace(); 
    ts.transactionRollback(false);} } public   static   Document   writerIndex(HashMap   hmp) 

    Document   doc=new   Document(); 
    try{   
    if(hmp.get( "fbz ")!=null) 
    doc.add(new   Field( "fbz ",   (String)hmp.get( "fbz "),Field.Store.YES,Field.Index.NO)); 
    else 
    doc.add(new   Field( "fbz ",   " ",Field.Store.YES,Field.Index.NO)); 
    }catch(Exception   e){e.printStackTrace();} return   doc; 

    这样就基本上解决了所有问题,基本上一秒半跑一百条数据。再次谢谢各位了
      

  3.   

    关键字:lucene.net 搜索排序 内存猛涨 内存溢出 IndexSearcher TopDocs weight/** *//** Creates a searcher searching the index in the named directory. */
    public IndexSearcher(String path) throws IOException ...{
        this(IndexReader.open(path), true);
      }  /** *//** Creates a searcher searching the index in the provided directory. */
      public IndexSearcher(Directory directory) throws IOException ...{
        this(IndexReader.open(directory), true);
      }  /** *//** Creates a searcher searching the provided index. */
      public IndexSearcher(IndexReader r) ...{
        this(r, false);
      }
      
      private IndexSearcher(IndexReader r, boolean closeReader) ...{
        reader = r;
        this.closeReader = closeReader;
      }在lucene应用中也许很多人都遇到这种情况。当索引太大(大于10G),搜索时用前两种构造方法声明IndexSearcher对象,这样每构造一个IndexSearcher对象,都要声明一个索引对象(实际上是一个索引的多次连接),而每个索引对象都要占用一定量的系统资源(主要是内存)。当大量用户访问系统时,就会看到系统内存直线增长,致使产生“java heap space”内存耗尽或内存溢出(.net)。这个问题可以通过以下方法解决:终极解决方法:
    联系方式: [email protected] , [email protected]