紧急求救!搜索引擎Lucene2.0创建海量(600万条数据)索引文件!

Love_your_whole_life 2007-11-06 11:10:31
我的600万数据分45个表在数据库里存储,所以我在用lucene2.0创建索引文件时也产生45个文件分开做查询。现在用程序要把海量数据一个个表(一个表最多数据达到20000)生成lucene引擎的索引文件。
我开始的想法是把一个表的数据一次性全部处理,很显然出现内存溢出。
现在改为一条条记录读取,读取一条记录就生成一个暂时的索引文件a,b是要生成的一个表的总索引文件,然后把a加到b中。实现了,却发现运行起来很费劲,并且越运行速度越慢。
这是我的测试时间,每100条数据记录一次时间:
刚开始:
10,20,30,40,50,60,70,80,90,100,
2007-11-06 22:37:09
110,120,130,140,150,160,170,180,190,200,
2007-11-06 22:37:12
210,220,230,240,250,260,270,280,290,300,
2007-11-06 22:37:16
310,320,330,340,350,360,370,380,390,400,
2007-11-06 22:37:20
两千条数据之后:
1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,
2007-11-06 22:39:07
2010,2020,2030,2040,2050,2060,2070,2080,2090,2100,
2007-11-06 22:39:16
2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,
2007-11-06 22:39:26
2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,
2007-11-06 22:39:36
2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,
2007-11-06 22:39:46


我的程序主要是这样写的:

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"));
FSDirectory radmdy=writerIndex(hap);
hap=null;
}
writer.optimize();
writer.close();

ts.transactionCommit(false);

}catch(Exception e){e.printStackTrace();
ts.transactionRollback(false);}

}
public static FSDirectory writerIndex(HashMap hmp)
{
TMCodeDao tmdao=new TMCodeDao();
FSDirectory ramDir = null;
try{
ramDir = FSDirectory.getDirectory("D:\\eclipse 3.2\\JavaScape\\HXAIC\\Index\\Index");
IndexWriter writerRam = new IndexWriter(ramDir,getAnalyzer(),true);
Document doc=new Document();



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));


writerRam.addDocument(doc);
writerRam.optimize();
writerRam.close();

}catch(Exception e){e.printStackTrace();}

return ramDir;
}


public static Analyzer getAnalyzer()
{
return new ChineseAnalyzer();

}
}

我该如何去优化程序呢?让处理速度提高,或者有没有更好的方法生成lucene索引文件

我接触lucene不深,希望知道的朋友能多多指教,不胜感激!
...全文
102 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
widexu 2008-12-26
  • 打赏
  • 举报
回复
关键字: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)。这个问题可以通过以下方法解决:

终极解决方法:
联系方式: jackbison@163.com , pc2004lcq@126.com
kcage 2007-11-09
  • 打赏
  • 举报
回复
帮顶一下
lmx8757921 2007-11-09
  • 打赏
  • 举报
回复
有难度.
xiyuan1999 2007-11-09
  • 打赏
  • 举报
回复
友情up
liuzi123 2007-11-07
  • 打赏
  • 举报
回复
关注
zhb_821012 2007-11-07
  • 打赏
  • 举报
回复
友情up
没弄过
  • 打赏
  • 举报
回复
我已经把不查询的字段弄成只读,把没有用到的字段去掉,可是还是不能提高速度。
具体的问题是越运行速度越慢
一万多以后的执行速度就已经这样了:
2007-11-07 10:30:57
12310,12320,12330,12340,12350,12360,12370,12380,12390,12400,
2007-11-07 10:31:35
12410,12420,12430,12440,12450,12460,12470,12480,12490,12500,
2007-11-07 10:32:15
12510,12520,12530,12540,12550,12560,12570,12580,12590,12600,
2007-11-07 10:32:55
12610,12620,12630,12640,12650,12660,12670,12680,12690,12700,
2007-11-07 10:33:35
12710,12720,12730,12740,12750,12760,12770,12780,12790,12800,
2007-11-07 10:34:15
12810,12820,12830,12840,12850,12860,12870,12880,12890,12900,
2007-11-07 10:34:58
12910,12920,12930,12940,12950,12960,12970,12980,12990,13000,
2007-11-07 10:35:41
13010,13020,13030,13040,13050,13060,13070,13080,13090,13100,
2007-11-07 10:36:23
13110,13120,13130,13140,13150,13160,13170,13180,13190,13200,
2007-11-07 10:37:05
13210,13220,13230,13240,13250,13260,13270,13280,13290,13300,
2007-11-07 10:37:49
13310,13320,13330,13340,13350,13360,13370,13380,13390,13400,

是不是我的程序有问题使得运行越来越慢呢?
qsc800528 2007-11-07
  • 打赏
  • 举报
回复
lucene的优化有很多

可以通过分词(字段是否被查询),索引(字段是否被查询)等等来提高速度

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧