关于lucene的RAMDirectory和FSDirectory的性能问题的困惑
关于lucene的RAMDirectory和FSDirectory的性能问题的困惑
并附了测试用例
我根据测试用例去实际测试了一下,结果是相反的
这让我很困惑,内存没道理比文件系统慢啊。。
附上执行结果:
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)
关于lucene的RAMDirectory和FSDirectory的性能问题的困惑的更多相关文章
- 基于Lucene查询原理分析Elasticsearch的性能
前言 Elasticsearch是一个很火的分布式搜索系统,提供了非常强大而且易用的查询和分析能力,包括全文索引.模糊查询.多条件组合查询.地理位置查询等等,而且具有一定的分析聚合能力.因为其查询场景 ...
- lucene中FSDirectory、RAMDirectory的用法
package com.ljq.one; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStrea ...
- Lucene的分析资料【转】
Lucene 源码剖析 1 目录 2 Lucene是什么 2.1.1 强大特性 2.1.2 API组成- 2.1.3 Hello World! 2.1.4 Lucene roadmap 3 索引文件结 ...
- Lucene学习笔记
师兄推荐我学习Lucene这门技术,用了两天时间,大概整理了一下相关知识点. 一.什么是Lucene Lucene即全文检索.全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明 ...
- lucene、lucene.NET详细使用与优化详解
lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应 ...
- Lucene入门的基本知识(四)
刚才在写创建索引和搜索类的时候发现非常多类的概念还不是非常清楚,这里我总结了一下. 1 lucene简单介绍 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不 ...
- lucene 使用教程
原文转自:http://cloudera.iteye.com/blog/656459 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像 ...
- 【转】Lucene.NET详细使用与优化详解
1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工 ...
- lucene使用与优化
lucene使用与优化 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿 ...
随机推荐
- Java源码阅读PriorityQueue
1类签名与简介 public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serial ...
- iOS小技巧 - 如何生成范围随机数
生成[0, N-1]的随机数 NSUInteger r = arc4random_uniform(N); 生成[1, N]的随机数 NSUInteger r = arc4random_uniform( ...
- 【Android Studio探索之路系列】之中的一个:Android Studio开篇
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...
- 【DB2】对两列分组之后判断另外一列是否有重复
建立表数据如下: ),sex ),sex_nm ),OWER ),TYPE ),TYPE_NM )); ,','水果'), (,','水果'), (,','水果'), (,','水果'), (,',' ...
- 基于Spring+Spring MVC+Mybatis的B2C购物网站
代码地址如下:http://www.demodashi.com/demo/12935.html 准备工作 当前项目运行的系统环境是MacOS,已经测试可以正常运行,并且之前开发的时候也在Windows ...
- AIDL调用指南
近期有需求要实现两个apk之间的通信,想到用AIDL来实现,现写一个demo学习下AIDL怎样使用. 这里我要实现一个apk(client端)调用还有一个apk(server端)的方法. 先实现ser ...
- Phalcon 訪问控制列表 ACL(Access Control Lists ACL)
Phalcon在权限方面通过 Phalcon\Acl 提供了一个轻量级的 ACL(訪问控制列表). Access Control Lists (ACL) 同意系统对用户的訪问权限进行控制,比方同意訪问 ...
- Commons-VFS 使用SFTP
http://pro.ctlok.com/2011/06/apache-commons-vfs-for-sftp.html
- 转:VLC搭建RTSP直播流,图文介绍
将一个视频转成rtsp流,通过vlc播放器,搭建一个rtsp服务器,让rtsp客户端去访问这个视频的rtsp流 1 需要有vlc播放器,我的版本如下 2 媒体 --> 流 3 添加视频文件 ...
- windowns 查看端口占用
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...