-
关于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
目前还没有答案
相关推荐
5. **Lucene-Store**: 包含用于存储和读取索引的不同策略,如RAMDirectory、FSDirectory等。 6. **Lucene-Util**: 提供了一系列实用工具类,如BitSet、FieldInfos、IndexInput和IndexOutput等。 7. **Lucene-Codec...
7. **内存与磁盘管理**: Lucene.Net利用RAMDirectory和FSDirectory类分别处理内存和磁盘上的索引存储。这允许在内存中快速访问,同时将大部分数据保存在硬盘上,以节省内存。 8. **多线程支持**: Lucene.Net支持多...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
6. **存储(Store)**:Lucene.NET使用RAMDirectory或FSDirectory来存储索引,前者在内存中,适合小规模数据,后者在硬盘上,适合大规模数据。 实际应用中,Lucene.NET常用于网站搜索、日志分析、知识图谱等场景。...
5. **内存索引与磁盘索引**: `RAMDirectory` 用于内存中的索引,而 `FSDirectory` 则用于磁盘上的索引,两者可以根据需求灵活选择。 **Lucene 3.0 API 更新与改进** 1. **SegmentMerger 改进**: Lucene 3.0 中,`...
- **Store**:用于存储索引数据的接口和实现,包括RAMDirectory和FSDirectory等。 通过阅读源码,开发者可以深入理解其内部工作原理,定制自己的搜索引擎解决方案。 四、案例实践 Lucene.Net 4.8.0搭配盘古分词,...
5. **存储模块**:`Directory`接口和它的实现类(如`FSDirectory`、`RAMDirectory`)负责索引和文档数据的存储。`FSDirectory`使用文件系统,而`RAMDirectory`则在内存中存储,适用于测试环境。 6. **评分模块**:...
在“关于lucene3.5的使用”这个主题中,我们将深入探讨Lucene 3.5的关键特性、核心组件以及如何通过实例进行应用。首先,我们需要了解以下几个核心概念: 1. **索引(Index)**:Lucene 的工作基于索引,就像书籍的...
- 创建索引:初始化Analyzer,创建Directory(如RAMDirectory或FSDirectory),然后使用IndexWriter添加Documents。 - 查询索引:使用IndexReader打开索引,创建IndexSearcher,构造Query,执行search方法获取匹配...
1. 初始化 Analyzer(例如使用 IKAnalyzer),并创建 Directory 对象(如 RAMDirectory 或 FSDirectory)来存储索引。 2. 使用 IndexWriter 实例化并配置参数,开始写入索引。 3. 创建 Document 对象,添加 Field,...
Lucene提供了高级的文本分析、索引和搜索功能,是构建高效、可扩展的信息检索应用的基础。在Java的网络搜索实现中,Lucene扮演着至关重要的角色,它能够帮助开发者快速构建自己的搜索引擎。 在"lucene包"中,我们...
Directory则用来保存索引,可以选择不同的实现,如内存中的RAMDirectory或磁盘上的FSDirectory。IndexWriter是构建和管理索引的关键对象。 接下来,你需要创建一个索引器类,该类使用Spring的ApplicationContext...
4. **存储模块**:`RAMDirectory`和`FSDirectory`提供内存和文件系统上的索引存储。 三、主要特性 1. **多线程支持**:2.3.0版本增强了多线程索引和搜索的性能,使得并发操作更为高效。 2. **查询优化**:优化了...
- **store**:管理索引的存储,如FSDirectory和RAMDirectory分别对应文件系统和内存中的存储。 - **document**:定义了文档和域的数据结构。 - **search**:实现索引的搜索,IndexSearcher和Query类是主要的搜索...
7. **内存与磁盘索引**: Lucene允许在内存或磁盘上构建索引,通过`RAMDirectory`和`FSDirectory`实现。这使得可以在内存中快速测试索引,而生产环境则可选择持久化到硬盘。 8. **多字段索引与多类型文档**: Lucene...
5. **内存与磁盘存储(Memory & Disk Storage)**:Lucene利用`RAMDirectory`和`FSDirectory`等类管理索引在内存和磁盘上的存储,以平衡性能和资源消耗。 为了在Eclipse中查看和理解这些源码,我们需要进行以下步骤...
1. 初始化:首先,你需要创建一个Directory对象来指向存储索引的物理位置,如RAMDirectory或FSDirectory。 2. 创建索引:使用IndexWriter添加文档到索引。每个文档实例化为Document对象,然后添加多个字段。每个...
例如,`FSDirectory`用于将索引存储在文件系统中,`RAMDirectory`则用于内存中的索引,这使得在内存有限的情况下也能进行快速测试。`SegmentReader`和`IndexReader`是读取索引的主要类,它们提供了对索引数据的访问...
Directory是存储索引的接口,可以使用不同的实现,如FSDirectory(文件系统)或RAMDirectory(内存)。QueryParser用于解析用户输入的查询字符串,生成Query对象。Searcher则用于执行查询,返回匹配的文档集。 3. *...
Lucene采用了高效的内存管理策略,如使用RAMDirectory和MMapDirectory进行索引存储,以及使用FSDirectory进行磁盘操作。此外,通过缓存策略,可以减少磁盘I/O,提高查询速度。 8. **扩展性和插件化** Lucene具有...