lucene中用到的优先队列

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板 EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细 阅读详情

jdk有一个java.util.PriorityQueue。lucene中也有个PriorityQueue.为了节约空间和更高效,lucene没有使用jdkp中的PriorityQueue.它们的主要读取方法时间都是的log(n),但也有些不同。

下面看看lucene中使用的PriorityQueue它内部是一个堆排序。
java.util.PriorityQueue是一个自增长的优先队列.也就是说,随着插入元素的增加,它的容量会越来越大,而 org.apache.lucene.util.PriorityQueue则不会,它是一个指定的容量的优先队列。因为它保存的始终是最大的数据.因此,如果只取前n个数据时可以用lucene的 PriorityQueue,这样可以达到节省内存。
下面分析一下原代码.
下面是lucene中的PriorityQueue的插入节点的实现细节,
public Object insertWithOverflow(Object element) {
if (size < maxSize) {//小于最大容量,直接放进堆
      put(element);
      return null;
    } else if (size > 0 && !lessThan(element, heap[1])) {//如果当前的堆已满,并且大于当前最小的元素,则将最小元素返回,并插入新元素
      Object ret = heap[1];
      heap[1] = element;
      adjustTop();//重新进行堆排序
      return ret;
    } else {//堆已满并且要插入的元素小于堆中最小的元素
      return element;
    }
}
heap[1]是堆顶,保存堆中的最小元素.
由引看出在org.apache.lucene.util.PriorityQueue中n是固定的,因此重新进行堆排序的时间是恒定的。

可能是为了提高插入效率,在org.apache.lucene.util.PriorityQueue的实现类TopDocCollector类中保存了队列中的最小元素,如果存在最小元素,则可以先与最小元素进行比较.再决定是否执行插入操作.
用变量保存了当前队列中最小的元素.以提高效率
   public void collect(int doc, float score) {
    if (score > 0.0f) {
      totalHits++;
      if (reusableSD == null) {
        reusableSD = new ScoreDoc(doc, score);
      } else if (score >= reusableSD.score) {//如果有最小元素,则与最小元素比较。如果大于最小元素则更新最小元素,并执行插入操作.
        // reusableSD holds the last "rejected" entry, so, if
        // this new score is not better than that, there's no
        // need to try inserting it
        reusableSD.doc = doc;
        reusableSD.score = score;
      } else {//如果小于最小元素,直接返回
        return;
      }
      reusableSD = (ScoreDoc) hq.insertWithOverflow(reusableSD);
    }
  }

不过个人认为insertWithOverflow方法里已经做了类似判断,而且从效率上来讲没区别,没必要在外面增加最小值判断,这样做反而容易引起逻辑不一致.
 
vllm运行过程中出现cuda out of memory 将长序列分解为多个小块,每个块分别处理。这样可以减少单次 Prefill 的计算量和显存占用,从而优化 TTFT 和显存使用效率。考虑使用 CPU 卸载(如 --cpu-offload-gb),将部分缓存卸载到 CPU 内存中,扩展 GPU 的虚拟内存。在大语言模型中,当输入序列很长(例如超过 1024 个 Token)时,Prefill 阶段的计算量会非常大。最后增加了enable-chunked-prefill参数和max_num_batched_tokens解决了问题。参数来进一步优化性能。 阅读详情

相关推荐

Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS

安装好了VINS-Mono所需的ROS noetic、Eigen3.4.0、Ceres2.10和OpenCV4.2.0等。VINS-Mono是在ROS melodic以及Ceres1的环境下开发的,因此需要适配高版本的环境。

zardforever123的博客 2万+

Lucene排序取TopN源码分析--PriorityQueue

PriorityQueue 实现一优先队列框架,实例非常简单,只需实现lessThan(Object a, Object b)方法即可,通过该方法可以控制大优先或小优先 通过分析lucene源码可知,lucene每命中一个结果,就调用一次collector.collect(doc)方法,由Collector把结果保存到一个PriorityQueue中。对于常见的取TopN的情况,通常实例化一个...

atarik@163.com 1085

安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案

本文主要介绍了安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案,希望能对使用Windows WSL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 7万+

Lucene中的PriorityQueue

在看Spellcheck源代码的时候,一直以为Lucene中的PriorityQueueJDK默认实现的优先级队列,所谓优先队列,顾名思义,其实就是一个最小堆的实现,通过每次取堆上的最小元素,进行堆排序。但实际上,Lucene自己定义了一个优先队列Lucene中的优先队列是一个抽象类,可以...

270

Lucene学习笔记之-核心数据结构PriorityQueue的实现原理

Luene的核心应用场景是全文检索。简单来说,就是通过用户输入的关键词来匹配相关文档,然后根据匹配程度返回TopN的查询结果给用户。 这里需要解决的一个核心问题就是如何快速返回TopN的结果,这本质上是一个排序的问题。说起排序,我们有很多选择,冒泡,快排,归并...。 这些排序算法在数据量小的时候,不是问题。一旦数据量过大,就成为问题了。 例如对1000万的数组排序: Intege...

weixin_34221773的博客 186

lucene PriorityQueue 优先队列

导读:   PriorityQueue 实现一优先队列框架,实例非常简单,只需实现lessThan(Object a, Object b)方法即可,通过该方法可以控制大优先或小优先。   package org.apache.lucene.search;   /**   * Copyright 2004 The Apache Software Foundation   *   * Lice

Gerry的专栏 1380

lucene实现的top k优先队列PriorityQueue简单原理

Lucene里使用比较多的一种集合就是这个 PriorityQueue 比如取前10条相关结果。 jdk本身也有一个优先级队列,为什么lucene要实现自己的呢。。 后面看了jdkPriorityQueue ,它是使用最大堆来实现的,而且它的长度是什么可以变长的,就是如果我要一个top k的数据,但它会将所有数据都存起来,当然小数据无所谓,但如果达到几十万,几百万的时候

搜索引擎、个性化推荐、大数据相关学习笔记| 3492

lucene util PriorityQueue 实现一优先队列

PriorityQueue  实现一优先队列框架,实例非常简单,只需实现lessThan(Object a, Object b)方法即可,通过该方法可以控制大优先或小优先。 package org.apache.lucene.search;/** * Copyright 2004 The Apache Software Foundation * * Licensed under the Apach...

信息检索与算法研究 203

lucene HitCollector 的作用

HitCollector 的作用很简单,通过collect()方法控制检索返回的结果,下面是lucene自带的一个例子----使用一个优先队列,返回指定数目的Top n Doc。 package org.apache.lucene.search;/** * Copyright 2004 The Apache Software Foundation * * Licensed under the Ap...

信息检索与算法研究 175

Java刀_Java尖刀系列3:堆

堆是一种特殊的二叉树,分两种:大堆和小堆。现在我们以Lucene中的代码为例来讲解堆的Java实现。代码来自:PriorityQueue.javapackage org.apache.lucene.util;/*** Copyright 2004 The Apache Software Foundation** Licensed under the Apache License, Version ...

weixin_29539039的博客 135

Lucene中的堆应用

Lucene中的堆   Lucene

Automay的专栏 636

Lucene 如何实现高性能 GroupBy <二>

转载:http://www.cnblogs.com/zengen/archive/2010/11/30/1892241.html 紧接上一篇 Lucene 如何实现高性能GroupBy  的讲:Lucene--Util--PriorityQueue.cs 先给大家看一段代码,来源于PriorityQueue类 protected internal void Initializ

学习笔记 1011

solr中docValues字段排序源码分析

分析docValues的字段的排序实现   根据各种字段的类型不同需要有不同的comparator 首先排序需要使用TopFieldCollector来收集doc topCollector = TopFieldCollector.create(weightSort(cmd.getSort()), len,             false, needScores, needScores

zhumeilian的专栏 3735

Lucene讀書筆記(四)

一些公用的基础类 表 3.2 基础类包org.apache.lucene.util 类 说明 Arrays 一个关于数组的排序方法的静态类,提供了优化的基于快排序的排序方法sort BitVector C/C++语言中位域的java实现品,但是加入了序列化能力 Constants 常量静态类,定义了一些常量 PriorityQueue ...

new_jeffer的专栏 164

lucene4.x收集器之TopDocsCollector

TopDocsCollector所有返回TopDocs的收集器的抽象基类。在收集完成后,根据一些条件收集前N个结果。这个收集器通过提供一个构造器来实现简单的扩展,构造器接受一个PriorityQueue以及该优先队列的受保护成员和总命中数的计数器。扩展类可以覆盖任何方法来提供它们自己的实现,同时可以通过将null传递给TopDocsCollector(PriorityQueue)来避免使用优先队列。但是这种情况下,可能要覆盖所有的方法来避免NullPointerException。

荣耀之路 810

计算机组成与体系结构 头哥平台实验代码

供在头哥教学实验平台学习计算机组成原理的同学参考

惠普打印机MFP M437-M443的驱动程序包

当连接惠普打印机 MFP M437-M443时,打印机驱动程序不能够自动下载时,可以进行离线安装打印机驱动程序。

上一篇: jQuery的部分总结
下一篇: junit测试web工程的简单方法
dknypxt
博客等级 码龄20年 4粉丝 53原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值