Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76187
  • 博文数量: 16
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 187
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-19 19:58
个人简介

一步一个阶梯,向人类进化。

文章分类

全部博文(16)

文章存档

2018年(1)

2015年(3)

2014年(11)

2013年(1)

我的朋友

分类: 大数据

2013-12-18 21:13:04

实验室需要一个mongodb数据库的搜索引擎,经过几天的奋战,总算是写完了,这里就记录一下lucene对mongodb数据库建索引的经验吧。

我的方法是多线程+RAMDirectory

刚开始,我以为很简单,从服务器上取出了90000条数据到本地数据库,然后每从数据库取出一条数据便对其建索引,结果就这样很**地一条一条地建了一个小时,而且只有10000条。请教了谷歌,发现lucene提供了RAMDirectory类库,可以先把索引建在RAM中,等超过缓存了再写到硬盘,这样可以大大提高速度,因为反复的读写硬盘是很慢很慢的操作。如果再结合多线程的话,想必速度又可以提升一大截。

在RAMDirectory建索引的方法:

点击(此处)折叠或打开

  1. RAMDirectory ramdir = new RAMDirectory();
  2.         Analyzer analyzer = new IKAnalyzer();
  3.         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer);

  4.             IndexWriter ramwriter = new IndexWriter(ramdir,config);
  5.             while (...){
  6.                     
  7.                 Document document = new Document(); document.add(...);
  8.                     ramwriter.addDocument(document);
  9.                 if (ramwriter.ramSizeInBytes() > rambuffer)
  10.                         ramwriter.commit();
  11.                         IndexWriter.addIndexes(ramdir);//写入到硬盘
  12.                         IndexWriter.commit();
  13.                     
  14.             ramwriter.close();

其中rambuffer我设置的是2M,对于多线程,我的方法是1W条数据一个线程,包括从数据库中取数据和建索引(RAM)两个过程,然后丢到线程池中运行。
下面是本人测试的速度:

rambuffer:2M

线程处理的数据个数:1W

cpu:2.1G双核

内存:2G

系统:Ubuntu 12.04

总数据量:9W

时间:40s左右

下面就是要到服务器测试大数据量啦。


阅读(2849) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:高并发web系统设计

给主人留下些什么吧!~~