本文是对这篇文章中的一个测试: 内存缓存与硬盘缓存访问速度的比较
数据准备代码:
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.payloads.PayloadHelper; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; public class SolrTest { public static void main(String[] args) throws IOException { Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); RandomAccessFile randomFile = new RandomAccessFile(new File( "DocReplication.text"), "rw"); Directory dir = new SimpleFSDirectory(new File("indexdir")); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_34, analyzer); iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); IndexWriter writer = new IndexWriter(dir, iwc); for (int i = 0; i < 2000000; i++) { // 向一个随机访问文件中写 randomFile.write(PayloadHelper.encodeInt(i)); randomFile.write(long2Array(i + 1)); randomFile.write(long2Array(i + 2)); // 向lucene中document中写 Document doc = new Document(); doc.add(new Field("id", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); doc.add(new Field("id2", String.valueOf(i), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); writer.addDocument(doc); System.out.println("point:" + randomFile.getFilePointer()); } writer.commit(); writer.close(); randomFile.close(); } static byte[] long2Array(long val) { int off = 0; byte[] b = new byte[8]; b[off + 7] = (byte) (val >>> 0); b[off + 6] = (byte) (val >>> 8); b[off + 5] = (byte) (val >>> 16); b[off + 4] = (byte) (val >>> 24); b[off + 3] = (byte) (val >>> 32); b[off + 2] = (byte) (val >>> 40); b[off + 1] = (byte) (val >>> 48); b[off + 0] = (byte) (val >>> 56); return b; } }
查询测试:
public static void test1() throws Exception { RandomAccessFile randomFile = new RandomAccessFile(new File( "/home/yunpeng/ali_workspace2/dtrace/DocReplication.text"), "rw"); long current = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { int docid = (int) (Math.random() * 2000000); randomFile.seek(docid * 20 + 4); randomFile.readLong(); randomFile.readLong(); } System.out.println((System.currentTimeMillis() - current)); randomFile.close(); } public static void test2() throws Exception { // Directory dir = new SimpleFSDirectory(new File("/home/yunpeng/ali_workspace2/dtrace/indexdir")); Directory dir = new MMapDirectory(new File("/home/yunpeng/ali_workspace2/dtrace/indexdir")); long start = System.currentTimeMillis(); IndexReader reader = IndexReader.open(dir); Document doc = null; for (int i = 0; i < 100000; i++) { int docid = (int) (Math.random() * 2000000); doc = reader.document(docid); doc.get("id"); doc.get("id2"); } System.out.println("consume:" + (System.currentTimeMillis() - start)); } public static void main(String[] args) throws Exception { for (int i = 0; i < 10; ++i) { test2(); } }
这里比较了SimpleFSDirectory,MMapDirectory,RandomAccessFile的性能。
MMapDirectory:
consume:916
consume:270
consume:179
consume:169
consume:143
consume:151
consume:157
consume:172
consume:138
consume:140
consume:270
consume:179
consume:169
consume:143
consume:151
consume:157
consume:172
consume:138
consume:140
SimpleFSDirectory
consume:1083
consume:443
consume:381
consume:377
consume:393
consume:374
consume:397
consume:364
consume:360
consume:395
consume:443
consume:381
consume:377
consume:393
consume:374
consume:397
consume:364
consume:360
consume:395
RandomAccessFile
684
664
639
645
639
651
639
689
643
652
664
639
645
639
651
639
689
643
652
相关推荐
### hbase+solr创建二级索引完整操作 #### 一、概述 本文档详细介绍了如何利用HBase和Solr创建二级索引的过程。通过整合HBase与Solr的优势,可以构建高性能的数据存储与检索系统。HBase作为分布式列族数据库,能够...
在“hbase-increment-index-master”这个项目中,很可能就是利用了Coprocessor来实现实时更新Solr索引。 接下来,我们来看看如何集成Solr。Solr是Apache Lucene的一个子项目,是一个高性能、全文本搜索引擎服务器。...
1. **索引构建**:Solr允许开发者定义自己的索引模型,支持多种类型的字段,如文本、数字、日期等,并能对字段进行分词、分析。 2. **分布式搜索**:SolrCloud模式下,数据可以在多个节点间分布,通过Sharding和...
4. 自动故障检测与恢复:SolrCloud通过ZooKeeper监控节点状态,一旦检测到节点故障,会自动将该节点的分片领导权转移给其他副本,并重新分配未被覆盖的索引请求。 二、索引和查询的处理流程 1. 数据输入:索引数据...
Solritas 是一种基于 Velocity 的模板系统,旨在简化 Solr 输出的开发流程,使开发者能够更快地进行原型设计和测试。 #### LucidFind 服务 **目的**:公司技术展示和服务,构建了一个面向社区的服务,对 lucene....
由包括的脚本在“ multi_1”字段中具有多个值的文档索引文档所生成的随机样本数据,并依靠更新的处理器来填充相应的“ min_1”和“ max_1”字段。 请注意,除了比较诸如min_l asc与field(multi_l,min) asc类的排序...
但可以通过建立二级索引来改善查询性能,如使用Solr或者Elasticsearch进行集成。 8. **故障恢复和高可用性**:HBase利用Zookeeper实现故障检测和恢复,当Region Server失效时,Master Server能够快速重新分配其管理...
**MySQL事务隔离级别**包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。 - **读未提交**:允许读取尚未提交的数据。 - **读已提交**:只能...
面试可能涉及倒排索引、分词、评分机制、集群部署和性能优化等。 11. **其他技术面试题**:这部分可能涵盖大数据领域的其他重要工具和技术,如HBase、Pig、Oozie、Tez等,以及云计算平台(如AWS、Azure、Google ...