0 0

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

在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;
	}
}
2010年5月11日 13:44
目前还没有答案

相关推荐

    lucene 最新版本所有jar包

    5. **Lucene-Store**: 包含用于存储和读取索引的不同策略,如RAMDirectory、FSDirectory等。 6. **Lucene-Util**: 提供了一系列实用工具类,如BitSet、FieldInfos、IndexInput和IndexOutput等。 7. **Lucene-Codec...

    lucene.net+完全入门教程

    7. **内存与磁盘管理**: Lucene.Net利用RAMDirectory和FSDirectory类分别处理内存和磁盘上的索引存储。这允许在内存中快速访问,同时将大部分数据保存在硬盘上,以节省内存。 8. **多线程支持**: Lucene.Net支持多...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene.net

    6. **存储(Store)**:Lucene.NET使用RAMDirectory或FSDirectory来存储索引,前者在内存中,适合小规模数据,后者在硬盘上,适合大规模数据。 实际应用中,Lucene.NET常用于网站搜索、日志分析、知识图谱等场景。...

    lucene 2.0 api以及lucene 3.0 api

    5. **内存索引与磁盘索引**: `RAMDirectory` 用于内存中的索引,而 `FSDirectory` 则用于磁盘上的索引,两者可以根据需求灵活选择。 **Lucene 3.0 API 更新与改进** 1. **SegmentMerger 改进**: Lucene 3.0 中,`...

    Lucene.net-4.8.0 -new Bate.rar

    - **Store**:用于存储索引数据的接口和实现,包括RAMDirectory和FSDirectory等。 通过阅读源码,开发者可以深入理解其内部工作原理,定制自己的搜索引擎解决方案。 四、案例实践 Lucene.Net 4.8.0搭配盘古分词,...

    Lucene.2.0.API

    5. **存储模块**:`Directory`接口和它的实现类(如`FSDirectory`、`RAMDirectory`)负责索引和文档数据的存储。`FSDirectory`使用文件系统,而`RAMDirectory`则在内存中存储,适用于测试环境。 6. **评分模块**:...

    关于lucene3.5的使用

    在“关于lucene3.5的使用”这个主题中,我们将深入探讨Lucene 3.5的关键特性、核心组件以及如何通过实例进行应用。首先,我们需要了解以下几个核心概念: 1. **索引(Index)**:Lucene 的工作基于索引,就像书籍的...

    最新版linux lucene-8.10.0.tgz

    - 创建索引:初始化Analyzer,创建Directory(如RAMDirectory或FSDirectory),然后使用IndexWriter添加Documents。 - 查询索引:使用IndexReader打开索引,创建IndexSearcher,构造Query,执行search方法获取匹配...

    lucene 3.6

    1. 初始化 Analyzer(例如使用 IKAnalyzer),并创建 Directory 对象(如 RAMDirectory 或 FSDirectory)来存储索引。 2. 使用 IndexWriter 实例化并配置参数,开始写入索引。 3. 创建 Document 对象,添加 Field,...

    lucene包,lucene实现核心代码

    Lucene提供了高级的文本分析、索引和搜索功能,是构建高效、可扩展的信息检索应用的基础。在Java的网络搜索实现中,Lucene扮演着至关重要的角色,它能够帮助开发者快速构建自己的搜索引擎。 在"lucene包"中,我们...

    spring-lucene简单项目

    Directory则用来保存索引,可以选择不同的实现,如内存中的RAMDirectory或磁盘上的FSDirectory。IndexWriter是构建和管理索引的关键对象。 接下来,你需要创建一个索引器类,该类使用Spring的ApplicationContext...

    lucene-2.3.0-src

    4. **存储模块**:`RAMDirectory`和`FSDirectory`提供内存和文件系统上的索引存储。 三、主要特性 1. **多线程支持**:2.3.0版本增强了多线程索引和搜索的性能,使得并发操作更为高效。 2. **查询优化**:优化了...

    lucene2.9开发指南

    - **store**:管理索引的存储,如FSDirectory和RAMDirectory分别对应文件系统和内存中的存储。 - **document**:定义了文档和域的数据结构。 - **search**:实现索引的搜索,IndexSearcher和Query类是主要的搜索...

    lucene 5.1.0 码源

    7. **内存与磁盘索引**: Lucene允许在内存或磁盘上构建索引,通过`RAMDirectory`和`FSDirectory`实现。这使得可以在内存中快速测试索引,而生产环境则可选择持久化到硬盘。 8. **多字段索引与多类型文档**: Lucene...

    lucene-4.0.0-src.zip 【Lucene 4.0.0源码包src , source】

    5. **内存与磁盘存储(Memory & Disk Storage)**:Lucene利用`RAMDirectory`和`FSDirectory`等类管理索引在内存和磁盘上的存储,以平衡性能和资源消耗。 为了在Eclipse中查看和理解这些源码,我们需要进行以下步骤...

    Lucene.Net-2.9.2 c#源码

    1. 初始化:首先,你需要创建一个Directory对象来指向存储索引的物理位置,如RAMDirectory或FSDirectory。 2. 创建索引:使用IndexWriter添加文档到索引。每个文档实例化为Document对象,然后添加多个字段。每个...

    lucene-2.4.0-src.zip

    例如,`FSDirectory`用于将索引存储在文件系统中,`RAMDirectory`则用于内存中的索引,这使得在内存有限的情况下也能进行快速测试。`SegmentReader`和`IndexReader`是读取索引的主要类,它们提供了对索引数据的访问...

    lucene-4.6.0官方文档

    Directory是存储索引的接口,可以使用不同的实现,如FSDirectory(文件系统)或RAMDirectory(内存)。QueryParser用于解析用户输入的查询字符串,生成Query对象。Searcher则用于执行查询,返回匹配的文档集。 3. *...

    lucene基本包

    Lucene采用了高效的内存管理策略,如使用RAMDirectory和MMapDirectory进行索引存储,以及使用FSDirectory进行磁盘操作。此外,通过缓存策略,可以减少磁盘I/O,提高查询速度。 8. **扩展性和插件化** Lucene具有...

Global site tag (gtag.js) - Google Analytics