关于lucene的RAMDirectory和FSDirectory的性能问题的困惑

关于lucene的RAMDirectory和FSDirectory的性能问题的困惑

在lucene in Action书中说RAMDirectory的性能总是比FSDirectory优越(书中2.7.2章节)
并附了测试用例
我根据测试用例去实际测试了一下,结果是相反的
这让我很困惑,内存没道理比文件系统慢啊。。
附上执行结果:
RAMDirectory Time: 500 ms
FSDirectory Time: 266 ms


以下是我的代码(基本照搬书中例子,只更改了for循环写法和使用了2.9的推荐方法取代了老版本的方法) 
 

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;

import junit.framework.TestCase;

/**
* 测试FSDirectory和RAMDirectory之间的性能差异
* 理论上来说,后者应大于前者,但是实际测试值相反,why? lucifer 2010-5-10
* @author lucifer
*
*/
public class FSversusRAMDirectoryTest extends TestCase
{
private Directory fsDir;
private Directory ramDir;
private Collection<String> docs = loadDocuments(3000,5);

protected void setUp() throws Exception
{
String fsIndexDir = System.getProperty("java.io.tmpdir","tmp")+File.separator+"fs-index";
ramDir = new RAMDirectory();
fsDir = FSDirectory.open(new File(fsIndexDir));
}

public void testTiming() throws IOException
{
long ramTiming = timeIndexWriter(ramDir);
long fsTiming = timeIndexWriter(fsDir);

// assertTrue(fsTiming>ramTiming);

System.out.println("RAMDirectory Time: "+ ramTiming +" ms");
System.out.println("FSDirectory Time: "+ fsTiming +" ms");
}

private long timeIndexWriter(Directory dir)throws IOException
{
long start = System.currentTimeMillis();
addDocuments(dir);
long stop = System.currentTimeMillis();
return (stop - start);
}

private void addDocuments(Directory dir)throws IOException
{
/**
* SimpleAnalyzer:把所有字符过滤成小写
* 把参数设为false时,使用RAMDirectory出错,报文件找不到
*/
IndexWriter writer = new IndexWriter(dir,new SimpleAnalyzer(),true,IndexWriter.MaxFieldLength.UNLIMITED);

/**
* 以下参数影响FSDirectory性能
* MergeFactor的值不能小于2
* MaxMergeDocs的值可以设置的比MergeFactor小,未见异常抛出
*/
writer.setMergeFactor(10);
writer.setMaxMergeDocs(10000);

for(Object obj:docs)
{
Document doc = new Document();
String word = (String)obj;
doc.add(new Field("keyword",word,Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("unindexed",word,Field.Store.YES,Field.Index.NO));
doc.add(new Field("unstored",word,Field.Store.NO,Field.Index.NOT_ANALYZED));
doc.add(new Field("text",word,Field.Store.NO,Field.Index.ANALYZED));
writer.addDocument(doc);
}
writer.optimize();
writer.close();
}

private Collection<String> loadDocuments(int numDocs,int wordsPerDoc)
{
Collection<String> docs = new ArrayList<String>(numDocs);
for(int i=0;i<numDocs;i++)
{
StringBuffer doc = new StringBuffer(wordsPerDoc);
for(int j=0;j<wordsPerDoc;j++)
doc.append("bibamus ");
docs.add(doc.toString());
}

return docs;
}
}

(转自:http://www.iteye.com/problems/42016)

转载于:https://www.cnblogs.com/fengweixin/p/3598136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lucene 是一种开源的全文搜索引擎库,虽然它已经具备了很好的性能,但在处理海量数据时,还需要进行一些性能优化的工作。以下是一些优化技巧: 1. 建立索引:建立合适的索引结构对于搜索性能至关重要。可以通过调整分词器、字段类型等参数来优化索引的构建过程。 2. 使用缓存:Lucene 提供了一些缓存机制,可以缓存频繁使用的结果,例如过滤器缓存、排序缓存等。合理利用缓存可以减少磁盘 I/O 操作,提升搜索效率。 3. 硬件优化:在硬件方面,可以使用更高性能的硬盘、增加内存等方式来提高 Lucene性能。特别是加大文件系统缓存可以加快索引和搜索的速度。 4. 查询性能优化:可以通过使用合适的搜索技术(如布尔查询、短语查询等)、调整查询权重、优化查询语句等方式来提高搜索效率。 5. 批量操作:对于大规模数据的操作,可以尽量使用批量操作方式,减少频繁的单条数据操作,以提高效率。比如通过批量提交文档,批量删除文档等方式。 6. 关键词匹配优化:对于一些特定的场景,可以通过使用同义词字典、拼写纠错、中文分词等方式来优化关键词的匹配,提高搜索的准确性。 7. 数据分片:对于大规模数据,可以将索引数据分片存储在多台机器上,通过分布式的方式来提高搜索的并发能力和吞吐量。 总的来说,lucene 性能优化涉及多个方面,包括索引构建、查询优化、硬件优化、批量操作等,需要根据具体应用场景和需求来选择合适的优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值