详情

全站展示位

Customize Ubuntu themes, icons and Shell方寸之间

Pre-requirements gtk+3 download gnome-tweak-toolsudo apt-get update and sudo apt-get gnome-tweak-tool Install an gnome shell Extensionsudo apt-get ...。。。

推荐

分类目录归档:ENglISh |

技術文章及人生思考

心灵鸡汤

006、《老人与乌龟》

有个老人到了90岁还觉得没活够,于是去山神庙求山神,山神问:“你只是祈求长寿吗?”他说:“是的。”山神说:“那么你就放心地回去吧。”老人往回走的时候,身子逐渐缩小,变成了一只乌龟,这个龟慢腾腾往回爬行的时候碰见石缝里的另一只龟,那只龟对他说:“我原先也是一个祈求长寿的人,山神把我变成乌龟后度过了漫长的三百年,除了僵硬的躯壳和微弱的呼吸外,一点生活乐趣都没有,想死也死不了,看来痛痛快快做人过三天也比没有意义的三百年强啊。”

列表展示

主站展示位

Arch Linux 如何切换内核方寸之间

Notice切换内核不是一件容易的事。我建议你有一个实际的理由这样做,而不仅仅是实验/为了好玩。虽然这本身并不是一个困难的过程。因为 linux 发行版通常设置为与特定内核配合使用。虽然有些不像其他发行版那样与内核紧密相连,但许多发行版维护者选择特…

Arch Linux 升级系统提示签名无效方寸之间

今天升级系统的时候,竟然升级失败了,提示:error: PackageName: signature from

PGP工作原理方寸之间

前言最近在浏览博客的时候发现博主的PGP Key页面,虽然之前知道是用于邮件通信加密的,但是具体原理及使用却不太清楚,所以找了时间查阅了相关资料,整理一下PGP加密的一些内容。定义Pretty Good Privacy(PGP)是一个加密程序,为数据通信提…

Arch Linux音响有杂音的解决办法方寸之间

Arch Linux 台式机(AMD)最近安装完新系统之后,在配置电脑的时候发现电脑的音响在不播放声音的时候会出现puta puta的声音。原因某些驱动模块会在声卡闲置时关闭它以节约用电。解决办法方法1:在/etc/modprobe.d目录下新建一个d…

C++中的智能指针是什么方寸之间

引言C++是一种广泛使用的编程语言,它允许程序员使用动态分配的内存。然而,手动管理内存可能会导致一些严重的问题,如内存泄漏和悬空指针。为了解决这些问题,C++引入了智能指针的概念。智能指针是一种特殊的指针类型,它可以自动管理内存并确保在不需…

PGP工作原理方寸之间

最近在浏览博客的时候发现博主的PGP Key页面,虽然之前知道是用于邮件通信加密的,但是具体原理及使用却不太清楚,所以找了时间查阅了相关资料,整理一下PGP加密的一些内容。

How to prettify git log output方寸之间

4 formats git log --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit git log --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit git log --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit git log --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit Config with alias For example: use 4th format. git config --global alias.logs

Build site with Franklin.jl方寸之间

Forward Franklin.jl is a simple, customisable static site generator oriented towards technical blogging and light, fast-loading pages. At first, I want to learning Julia with a small open source project, smaller and better. Then I search on github with topic#julia, and I find this tool. As I learned about it on its site, I think I can use this for my massively personal site(maybe it is beautiful, but too complex), and learning Julia when rebuilding my site. Therefore, I write this tutorial as my beginning. Last but not least, Franklin.jl has many features: Augmented markdown allowing definition of LaTeX-like commands, Easy inclusion of user-defined div-blocks, Maths rendered via KaTeX, code via highlight.js both can be pre-rendered, Can live-evaluate Julia code blocks, Live preview of modifications, Simple optimisation step to compress and pre-render the website, Simple publication step to deploy the website, Straightforward integration with Literate.jl. Setup Environment...

Linux的cron命令详解方寸之间

Cron是Linux一个很有用的工具,也是开发人员最喜欢的工具,因为它可以让你使用通用脚本和特定于任务的脚本在特定的时间段、日期和间隔自动运行命令。有了该描述,你可以想象系统管理员如何使用它来自动执行备份任务、目录清除、通知等。 Cron作业在后台运行,并不断检查/etc/crontab文件,/etc/cron.*/和/var/spool/cron/目录。我们最好不要直接编辑cron文件,因为每个用户都有唯一的crontab。 那你应该如何创建和编辑cron作业?我们可以使用crontab命令。crontab是用于创建,编辑,安装,卸载和列出cron作业的方法。 创建和编辑cron作业的命令是相同而且很简单。而且更酷的是,你无需在创建新文件或编辑现有文件后重新启动cron。 $ crontab -e Cron语法 就像使用任何语言一样,当你了解cron的语法时,使用cron会容易得多,它的语法有两种格式: A B C D E USERNAME /path/to/command arg1 arg2 OR A B C D E USERNAME /root/backup.sh 以上cron语法的说明: A:分钟范围:0 – 59 B:时间范围:0 – 23 C:天数范围:1 – 31 D:月范围:1 – 12 or JAN-DEC E:星期几:0 – 6 or SUN-SAT,Sunday=0 or 7。 USERNAME: 用户名 /path/to/command – 你要计划的脚本或命令的名称 形象一点表示就是: ┌───────────── minute (0 - 59) │ ┌───────────── hour (0 - 23) │ │ ┌───────────── day of the month (1 - 31) │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT, Sunday=0 or 7) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * * 此外,Cron使用3个运算符,可以在字段中指定多个值: 星号(*):指定字段的所有可能值,* * * * * 在每天的每分钟运行。 逗号(,):指定值列表,2,10 4,5 * * *在每天第 4 和第 5 小时的第 2 和第 10 分钟运行。 破折号(-):指定值范围,0 4-6 * * *...

How to Create Linux Desktop Entry方寸之间

create a file named yourappname.desktop in /usr/share/applications/ directory or ~/.local/share/applications/. input the following lines: [Desktop Entry] Type=Application Terminal=false Exec=/path/to/app Name=app Comment=app comment Icon=/path/to/app/icon

[译]费曼技巧:最好的学习方式方寸之间

写在前面 最近读书的时候偶然发现了费曼技巧,所以查阅了一些资料,找到了这篇文章,写的还不错,就翻译了一下给大家看看,原文在这里。 其实费曼技巧原理很简单,当时了解到的时候,就感觉有点像我给自己的父母去解释一些新的概念的时候的思路:用简单的语言去解释一些较为复杂的概念,在这个思路的转换期间,你也就学会了这个概念。 如果你正在寻找一种方法来增强你的学习并变得更聪明,那么费曼技术可能就是绝对学习任何东西的最佳方法。 费曼技巧(Feynman Technique)有四个步骤: 选择想学习的概念 假装正在将其教给小孩子 找出解释中的空白(gaps,自己不理解的部分);回到原始资料,以更好地理解它。 查看并简化(可选) 如果你不学习,就表示停滞不前。但是,我们如何获得关于所学知识的反馈?以及我们如何去学习新的学科并找出我们现有知识中的空白? 两种知识 费曼了解了解某事和知道某事的名字之间的区别,这是他成功的最重要原因之一。我们大多数人专注于错误的知识类型。第一种知识集中在知道事物的名称,即所谓的事物名称。第二种知识重点是实际了解一些东西,即了解一些东西。 “说自己知道自己的想法但无法表达的人通常不知道自己的想法。” —莫蒂默·阿德勒 费曼技巧 第一步:教给孩子(Teach it to a child) 取出一张空白的纸。在顶部写下你要学习的主题。现在,把你要了解的所有知识写出来,就像在教给孩子一样。不是你的聪明成人朋友,而是12岁的孩子,而且他的词汇量和注意力跨度足以理解基本概念和关系。 事实证明,我们欺骗自己的方法之一就是我们使用了复杂的词汇和行话,以掩盖我们缺乏理解的事实。 当你以一种可以让孩子理解的简单语言从头到尾写下一个想法时,你会强迫自己更深入地理解该概念,并简化这些想法之间的关系和联系。其中一些可能很容易理解。在这些地方你可以清楚地了解该主题。在其他时候,你会很挣扎。这些是你在理解上有一些空白的地方。 第二步:检查(Review) 只有当你遇到知识上的空白时,即你忘记了重要的东西,无法解释它,或者只是在思考一些因素如何相互作用时,才能真正开始学习。 既然你已经知道自己陷于何处,那就回到原始资料重新学习它,直到可以用基本术语进行解释。当你可以不加专业术语地阐述自己的理解时,就可以表明自己真正理解它了。这是学习新知识所必需要的努力,如果你跳过这一步会导致“已经理解了“的错觉。 确定自身的理解范围还可以限制您可能犯的错误,并增加应用知识时获得成功的机会。 第三步:组织和简化(Organize and Simplify) 现在,你有了一组手工制作的笔记。检查它们,以确保你没有错误地从原始资料中借用任何专业术语。将它们整理成一个简单的解释,你可以说出来给自己听。如果阐述的不简单或听起来令人困惑,则表明你对该领域的理解仍需要一些努力。 如果你一遍又一遍地遵循这种方法去学习新的知识,最终将得到一个装订满各种主题页的活页夹。如果你每年花费一些时间整理这种活页夹,你会发现你已经学会了很多东西。 第四步:可选:传播(Transmit) 如果你真的想确定自己的理解力,那就把它说给某个人听(最好是对这门学科了解甚少的人,或者找到那个12岁的孩子!)。对你掌握的知识的最终考验是你将知识传达给他人的能力。 费曼技巧不仅是学习的绝妙方法,而且还是进入不同思维方式的窗口,可让你将想法分解并从头开始进行重构。你不仅可以加强自己的学习,而且还可以加强他们的学习。重要的是,以这种方式处理问题可以使你了解那些不知道他们自己在说什么的人。(请参阅贝茨模拟)Feynman的方法直观地认为,智力是成长的过程,与Carol Dweck的著作很好地吻合,后者很好地描述了固定和成长心态之间的差异。

Archlinux Install & ConfigArch Linux Installation Guide on HP Pavilion方寸之间

My computer details: Computer: HP Pavilion laptop CPU: Intel i5-8250U GPU: NVIDIA MX150 Pre-installation Verify the boot mode To verify if it is UEFI mode, use this command: ls /sys/firmware/efi/efivars If it show some details, the system is UEFI. Otherwise, the system may be booted in BIOS or CSM mode. Connect to the internet Because I'm using HP laptop. so i just need connect to wifi with this command wifi-menu. If you want to connect to wired network, reference official guide about dhcpcd You can check this connection by ping www.archlinux.org. Update the system clock Use timedatectl set-ntp true to ensure the system clock is accurate, to check the service status, use timedatectl status. Partition the disks Use lsblk or fdisk -l to vertified device. First, run fdisk /dev/sda(note: if your device is /dev/sdX, run fdisk /dev/sdX), and you will enter the fdisk dialog. Next enter m...

Multithreaded Processing in Dynamic Inverted Indexes for Web Search Engines方寸之间

ABSTRACT 在Web搜索引擎中处理查询需要有效地使用硬件资源来应对用户流量的规模和动态。本文重点讨论了多线程处理查询,这些查询需要访问大型反向索引数据结构以获取一组文档,通过执行WAND运算符对它们进行排名,以获得前K个最相关的文档。以及在执行查询的同时解决在反向索引上插入新文档的问题。 我们提出了一种高效的策略来为查询和索引更新操作分配线程,这种策略适合于在查询处理的同时支持索引的更新。 我们提案的核心是一种简单的分类技术,旨在快速为查询操作分配线程。 Introduction Web搜索引擎中最耗时的任务是对用户查询的大量潜在答案的排名。其成本与在支持搜索引擎服务的处理器的分布式存储器集群中保持索引和压缩的Web样本的(通常是巨大的)大小成比例。每个处理器都保存一小部分Web样本,该样本在称为倒置文件或索引的数据结构中索引。基本上,反向文件由词汇表组成,该词汇表包含Web示例中找到的所有相关术语,并且对于每个术语,存在包含该术语的Web文档的列表以及诸如术语文档内频率的额外数据。该索引可以快速检索包含所有查询项的文档以及计算这些文档的分数所需的额外数据。分数越高,文档对于给定查询越相关。然后通过选择具有最高分数的K个文档来产生查询的答案。有几种方法可以为Okapi BM25 等文档分配分数。 WAND运算符通过将与文档评分(例如,BM25)相关联的昂贵计算限制为仅几个文档,同时跳过没有机会进入前K个的文档,使得能够有效地执行文档排序过程。这使得文档评分成为一个进程,其运行时间成本是不可预测的,并且在查询中变化很大。不可能假设其成本与所涉及的文档列表的长度成比例。因此,在运行时以及在很短的几分之一秒内确定分配给WAND操作的线程数变成了一个非常重要的问题,因为总执行成本仅在查询完全已知时才知道在处理器中解决了。 多线程查询处理的实用方法是让每个活动查询由单个线程顺序处理。由于Web搜索引擎始终包含大量活动查询,因此在不需要支持倒置文件中的并发更新时,这种方法在实践中非常有效。但是,当需要支持在倒置文件中插入新文档时,这种方法效率不高。在这种情况下,必须修改许多文档列表,并且由于人们倾向于在文档和查询中使用一组非常流行的术语,因为在处理查询和线程更新文档列表的线程之间的冲突读写操作可能会降低性能。 [4]中提出的解决方案允许所有线程一次参与一个查询或索引更新的并行处理。由于传入的查询/更新请求是按顺序处理的,因此不会发生读取和写入冲突。当文档包含足够大的术语时,此策略是合适的,并且可以有效地使用所有线程来解析每个查询。但是,在许多情况下,WAND需要一些线程来使用处理器中可用的所有线程所需的时间大约相同(甚至更短)。因此,这种方法不能扩展WAND查询,并且通常,它不能扩展到支持高效执行大量线程的处理器。 请注意,在生产搜索引擎中,我们应该期望在索引更新之间使用可变大小的用户查询序列来处理工作负载。我们研究了几种利用这一事实的方法。例如,除了使用每个查询/更新操作的单个线程和锁定以防止读/写冲突的简单但效率低的策略之外,我们可以累积足够的更新操作以在索引更新期间保持所有线程忙,并快速处理批处理通过将一个或多个线程正确分配给单个查询来使查询保持繁忙,以便尽快使用每个批处理。在这种情况下,特别是对于小批量,每个查询分配一个线程不是一个好主意,因为查询解决方案时间的差异可能非常高,从而产生空闲线程,并且在许多情况下,顺序查询解决方案时间可能超过预先定义的时间作为设计要求对搜索引擎施加的查询响应时间的上限。 在本文中,我们提出了一个有效解决WAND查询批处理问题的解决方案,每个WAND查询都有适当数量的线程来快速解决它们并避免在每个批处理结束时空闲线程。我们的解决方案基于工作单元中的查询分解,这些查询放在队列中,线程从这些队列中完成下一个工作。为了完成查询分解,我们提出了一种新的分类方案,该方案非常快速并且达到了合理的精度。根据该方案,我们提出了一种更新倒排文件的策略,该策略将处理并发查询/更新操作的整个任务转换为比以前的方法更有效的方法。 本文的结构如下。第2节介绍相关工作。第3节描述了我们用于查询和文档插入的线程分配技术,以及我们的分类技术。第4节介绍绩效评估研究,第5部分介绍结论。 Related work 现代搜索引擎使用倒排索引来加速文档搜索过程。倒排索引是一种简单的结构,它存储文档数据,允许快速查找和排列包含某些查询术语的集合的文档[10]。在倒排索引中,我们存储表示单个术语的倒排列表以及包含该特定术语的所有文档。文档由数字文档标识符(docID)表示,并且通常还存储每个特定文档中术语的频率(特定术语的该文档中出现的次数)。还可以存储附加信息,例如每个文档中术语的各个位置。还有许多压缩技术[9,3,2]用于以高效的方式存储倒排索引,这其中的许多压缩技术存储越来越多的docID,以便只有delta(docID和前一个之间的差异)存储。 确定可在docID有序索引中使用的前K个(top-K)文档的一种有效方法是WAND [5]。WAND算法将查询术语列表按每个查询术语的当前docID排序。该方法使用每个文档的分数的上限通过列表前进,并丢弃其分数不大于当前top-K文档中的最不相关候选者的那些,其得分是查询的当前阈值。因此,该算法仅计算那些不能被丢弃的候选者的完整分数,减少了为每个查询执行的计算总量。通过跳过整个发布列表块[6]和并行化[8]的处理来改进这种技术。 WAND使用基于文档的两级评估的排名。在第一级,它使用每个文档的分数的上限来尝试丢弃尽可能多的文档。在第二级,它计算通过第一级测试的文档的真实分数。为了使这个过程高效,它使用堆数据结构来存储到目前为止找到的最好的top-K文档。堆中排名最低的文档的分数被用作第一级评估的阈值,以丢弃不能作为最终前K文档的一部分的文档。这样可以实现高效的丢弃过程,确保在此过程中不会丢失相关文档。这意味着实现多线程WAND的两种方法。其中一个是使用本地堆(LH),每个线程一个,另一个是使用共享堆(SH)。在LH方案中,每个线程处理索引的一部分,同时保持本地堆与当前特定线程找到的当前top-K文档。在该过程结束时,每个线程的结果必须合并到一个结果集中。在SH方案中,每个线程处理索引的一部分并将文档存储在共享堆中。 在共享堆方案中,不需要合并,并且丢弃过程往往更有效(因为具有更高分数的文档往往在堆上)。但是,必须通过原始锁(lock primitive,就这么翻译了)来控制对堆的访问。我们在第4节中描述的实验设置下进行了测试以比较两种方法的平均时间和效率,我们发现SH WAND通常对多线程WAND更有效[8],见图1。所以我们选择了共享堆WAND在我们的实验中使用。 PROPOSAL Threads Management 我们将倒排索引分区以通过为单个查询分配多个线程来执行多线程查询处理。为实现这一目标,我们将每个术语的列表划分为多个独立列表。分区数等于处理器中允许的最大线程数。要解析具有一定数量线程的查询,我们在参与线程之间分配不同的部分。但是,如果我们启动将解析单个查询的线程并等待它们在为其分配处理其他查询之前结束其工作,则会有空闲线程等待参与线程完成其工作,如图2所示。 相反,我们建议通过在我们称之为工作单元的分解查询处理来增加维持所有线程忙于执行有用工作的机会,如图3所示。为此,我们将查询划分为多个独立单元,这些单元等于分配的线程数,并将这些单元存储在共享队列中。一旦线程完成其当前的工作单元,它就会从队列中获取下一个工作单元。对队列的访问由简单的锁定机制控制。这是可以接受的,因为我们感兴趣的是优化系统的查询吞吐量(每单位时间的查询),前提是单个查询响应时间不大于给定的边界。 用于确定任何到达查询的工作单元数的分类方案是使我们的方案正常工作的关键参与者,因为查询处理时间可以显着地相互影响。在我们的方案中,可以使用大量线程来解决要求严格的查询以减少其处理时间,而需要很少工作的查询可以被调度为共享队列中的单个单元。问题是事先不知道查询的实际工作量。我们的分类方案设计用于预测运行时任何查询的不同线程数所需的工作量。它必须是在很短的时间内提供合理预测的快速方法。 A Simple and Fast Classification Technique 我们提出了一种简单的策略来确定分配给每个查询的正确线程数。与更复杂和精确的方法相比,该方法在查询时非常有效并产生了良好的结果(比较研究见第4节)。我们的分类方法背后的概念是,没有必要花费大量资源来预测查询运行时间,以估计查询的适当线程数。预测的目标实际上并不是知道真实的查询时间,而只是知道适当数量的线程。 请注意,当使用太多线程来处理给定查询时,会出现显著的开销,特别是考虑到多线程WAND的平均效率对于大量线程而言往往较低(我们定义效率为最大线程工作除以平均线程工作)。通常,由于需要少量计算,因此可以处理大量快查询,因此无需使用多个线程来解决它们。此外,由于需要解析大量计算,因此处理的慢查询数量相对较少。查询分类的目标是识别慢查询以分配更多资源来解决它们。 实现此识别的一种方法是使用机器学习技术来预测处理查询的成本。这可能涉及使用预测技术,范围从简单的线性模型到使用大量特征进行更精确预测的模型,甚至使用人工神经网络和其他复杂的机器学习技术。然而,这将需要预测每个不同数量的线程的查询时间,这可能导致需要为每个案例训练模型并且在查询到达时间对每个模型执行预测计算。然后,在查询时有效使用处理器线程的低成本启发式方法是为查询选择最小的线程数,以确保整个查询响应时间的上限。 但是,对于慢查询,它必须至少引用与查询术语相关联的大型发布列表所代表的许多文档。即使其他方面影响查询成本,例如每个文档发布列表上的术语频率分布,以及查询术语之间的关系,但是查询引用许多文档是必要条件。考虑到这一事实,在我们的方法中,我们只使用查询项的数量和各个发布列表的长度总和来执行设置要分配给查询的线程数所需的分类。 我们的技术首先确定查询中的术语数量,因为它是影响查询时间的重要因素。例如,在我们的实验数据(第4节)的示例中,我们发现,当使用一个线程顺序处理时,只有4.8%的具有2个术语的查询花费超过160毫秒,而具有5个术语的35%的查询需要类似时间。这部分是因为具有更多术语的查询往往需要审阅更多文档,但是由于他们使用包含所评估文档的所有相关术语的数据,因此计算得分的成本也更高。 在每种情况下,我们独立地计算查询项列表长度的总和,并使用它们来确定应该分配给查询的线程数。这是通过使用之前在训练阶段确定的截止值(或阈值)来实现的。计算截止值,以便它们倾向于分配足够的线程,以确保查询花费的时间小于上限。这个界限可以定义为训练数据集中查询的平均连续运行时间的一到两倍之间的值。这种方法比上面描述的方法更不灵活,它包括测试几个线程,直到达到不超过上限的最小数量为止。在我们的案例中,在训练时确定了界限及其各自的界限值。但是,我们的方法比其他方法快了几个数量级,只给实际查询执行时间增加了几纳秒。 为了确定适当的截止值,我们使用训练查询的样本,并计算每个线程数的实际执行时间。为了简单起见,我们只使用2的幂作为分配给查询的潜在线程数。因此,例如,对于一个高效地支持16个线程执行的处理器,我们有5类查询,根据1、2、4、8或16个线程是否实现了确保查询时间小于上限的最小线程数。 在准备阶段,我们根据术语的数量分离训练查询,并且在每种情况下,我们独立地按列表的长度总和对它们进行排序。因此,我们获得了一组对(文档总数,线程数ID)按文档总和排序,并且类ID等于所用线程数。对于此集合中文档总和的4个cuto ff值,我们可以将查询分为5个类,用于前一个支持16个线程的处理器示例。这可以扩展到任意数量的处理器线程(类),因为这些总和在实际Web样本中往往是非常大的值。 为了确定cuto ff值,我们执行搜索过程以找到最大的F-Score的值。对于增加cuto ff值的任意初始化来定义每个类的限制,我们通过根据正确分类的查询数量计算True Positive案例,False Positive案例和False Negative案例来确定所选择的cuto ff值集合的好坏程度。每节课。如前所述,当相关联的线程数是产生低于上限的查询执行时间的最小线程数时,认为查询被正确分类。通过这些计数,我们计算精度(真阳性除以真阳性和假阳性的总和)和召回(真阳性除以真阳性和假阴性的总和)。通过这种方式,平均F-Score被定义为Precision和Recall指标的调和平均值,因此我们只需寻找最大化类集平均F-Score的cuto ff值。 网络搜索引擎用户倾向于使用极少数条款提交查询。我们通过定义由1,2,3,4,5和5个以上术语的查询组成的训练集来利用这一事实。对于每组,我们用上述方法获得cuto ff值的矢量。然后在查询运行时选择右侧集。 Dynamic Indexing 我们研究的重点是优化处理节点的性能,该处理节点使用多个线程解析查询,并且还在主存中保持倒排索引更新。该节点必须允许向Web文档索引集中添加新文档。在标准实践中,我们假设docID是增加的整数,其中索引列表通过增加docID来保持排序,以实现其高效压缩[2]。 在我们的实验中,我们省略了文档删除的情况,因为压缩索引列表的实现面临的困难超出了本文范围。 一种粗略但实用的方法是定期重建受影响的索引列表,并跟踪无效的docID,以便在查询的文档排名过程中省略它们。 WAND同时处理查询中涉及的所有索引列表。 因此,在解决查询之前必须锁定所有这些索引列表。以相同的方式,如果正在修改查询中涉及的任何索引列表,则必须等待修改完成以继续处理查询。有几种方法可以处理潜在的读/写冲突。在下文中,我们描述了我们在应用领域中发现的最有效的策略。注意,通过使用数据库和操作系统文献中提出的并发控制策略(例如,读和写锁)来同时处理查询和索引更新的方法已经在[4]中进行了测试。 我们设计了三种策略来解决新文档的插入问题,并根据不同的文档到达率评估它们的性能。我们称之为直接插入的第一种方法是安排将每个新文档作为工作单元插入队列中。任何空闲线程都可以使用此工作单元并在涉及的索引列表上执行插入过程。通过迭代新文档的每个术语,请求对要修改的列表的独占访问锁定,并在释放锁定并移动到下一个索引列表之前插入具有相应术语频率的新文档docID来解决插入。 第二种方法,我们称之为批量插入,首先收集一定数量的新文档,然后构建临时子倒排索引。 在这种情况下,主索引中的插入过程比直接插入中的插入过程更有效,因为在新文档中出现多次的术语将具有在子倒排索引中具有多个文档的索引列表。 然后,将子索引插入类型工作单元插入队列中。 因此,当空闲线程占用该工作单元时,它仍然在插入所涉及的每个索引列表的文档,而其他线程继续同时解决查询。 第三种方法类似于第二种方法,在临时子索引中为其组织收集了一定数量的文档,但是不是生成单个工作单元,而是将子索引术语加上它们各自的索引列表分布到多个工作单元中,这样所有线程都可以并行处理插入。 我们称这种方法为分布式批量插入(Distributed Batch Insertion),它有望改进以前的方案,因为它可以消除来自查询和索引列表更新的独占访问锁之间的冲突。当所有线程在处理当前批次查询的同时完成所有线程时,实际上消除了冲突。 在第二种和第三种情况下,插入过程比第一种情况要快得多,因为涉及的发布列表保持锁定在主索引中。 这是因为大部分处理时间都花费在构建子倒排索引上,因此一旦子发布列表准备插入,它们在相应主索引发布列表末尾的位置就会非常快速地执行,因为它需要的计算量要少得多。 EXPERIMENTAL EVALUATION 我们使用来自TREC GOV2 Collection的2500万个文档中的16个线程来评估解决WAND查询的不同方法,并在每个实验中解决50,000个查询。 我们构建了一个倒排索引,其发布列表分为16个部分,可以在查询时分配给线程。使用Simple 9 [1]作为代表性技术压缩索引,压缩比和解压缩速度之间具有良好的平衡。 所有实验均使用两个四核英特尔(R)Xeon(R)CPU E5620 @ 2.40GHz处理器和96GB RAM进行。 我们使用C ++实现了这些技术,并使用优化选项-O3使用g ++ 4.4.5编译了代码。 在实验中,我们使用主内存中的完整索引执行固定数量的查询(50,000)。在查询解决的同时,在索引中插入可变数量的文档,从50到50,000个文档。我们评估了处理文档插入(直接插入,批量插入和分布式批量插入)的三种技术的性能,并结合4种技术来确定每个查询使用的单位数。我们使用(a)每个查询1个单元(即用一个线程顺序解决每个查询),(b)完美估计器,其中查询时间事先已知,并且之前已用于确定满足条件的最小线程数查询响应时间的上限,(c)WAND查询[7]中提出的多变量线性估计器,它估计我们使用它的顺序查询时间,如完全估计器的情况,以及(d)我们的简单分类器方法训练使用一组与实验中使用的查询不同的查询。 在每种情况下,我们都测量了系统解决所有查询和插入所有文档所需的总时间。 图4,5,6和7显示了每种技术解决插入所花费的总时间,并结合了为查询分配单元的每种方法。图8显示了分布式批量插入的每个单元分配技术的总时间,因为它可以获得最佳结果。这个图省略了每个查询1个单元的情况,因为它没有达到良好的性能。结果表明,通过Simple Classifier结合Distributed Batch Insertion进行多线程处理是最佳选择。 搜索引擎的设计要求是实现高吞吐量,其在先前的图中由完成该组操作所需的总时间表示。 另一个相关的设计要求是各个响应时间低于给定上限时间的查询的百分比。 在下文中,我们评估查询的90Percentile和99-Percentile时间限制值。 也就是说,我们显示最小时间限制值,以确保在比相应绑定值更短的时间内完全处理90%和99%的查询。 如图9和10所示,通过使用每个查询1个单元的方法实现的查询时间限制值远远高于使用替代工作单元分配技术观察到的值。这进一步证明,这种方法虽然易于实施,但并不像其他替代方案那样有效,因此我们将其丢弃。 图11至图16显示简单分类器策略在99-百分位查询约束时间内具有竞争性,其中简单分类器和多线性估计技术之间的差异相当小。然而,当考虑如图8所示的总执行时间时,简单分类器优于多线性估计器,因为它引入查询处理的累积开销要低得多。 CONCLUSIONS 本文重点讨论了在Web搜索引擎的倒排索引中执行更新的同时处理多线程查询的问题。我们已经提出了一种有效的策略来动态地分配线程,以根据它们的特定特征处理各个查询。我们将查询处理分解为多个工作单元,这些工作单元可以由多个线程并行处理。我们设计了一种简单的分类方法来确定每个查询的工作单元数,这种方法足够精确且比其他查询时间估计策略快得多。根据该方案,我们建议在执行实际索引更新并在所有线程之间分发整个插入任务之前,在子索引中预处理文档。总的来说,提出的方法是以两步方式进行,其中(1)通过在查询级别应用并行性使用所有线程处理一批待处理查询,随后(2)处理一组待处理发布列表更新。批量使用并行的所有线程。实验表明,这两步策略对搜索引擎查询吞吐量有积极影响,并确保查询时间的竞争上限。 REFERENCE [1] V. N. Anh and A. Moffat. Inverted index compression using word-aligned binary codes. Inf. Retr., 8(1):151–166, 2005. [2] D. Arroyuelo, S. Gonz´alez, M. Oyarzu´n, and V. Sepulveda. Document identifier reassignment and run-length-compressed inverted indexes for improved search performance. In SIGIR, pages 173–182,...

友情链接方寸之间

欢迎交流联系,互换友链!

Make a TODO robot with Github Actions方寸之间

What's Github Actions Github Actions is a CI(continuous integration) and CD(continuous deployment) service that help you automate your software development workflows in the same place you store code and collaborate on pull requests and issues. It was launched in October 2018 and was officially available to all users in November 2019. With Github Actions you can write individual tasks, called actions, and combine them to create a custom workflow. Workflows are custom automated processes that you can set up in your repository to build, test, package, release, or deploy any code project on GitHub. You can create workflows using actions defined in your repository, open source actions in a public repository on GitHub, or a published Docker container image. But workflows in forked repositories don't run by default. If you don't want to create your actions by yourself, you can discover actions in the GitHub Marketplace, also...

Linux挂起和休眠的区别方寸之间

linux的挂起和休眠之间的区别到底是什么? Linux有三种挂起方式:挂起至RAM(通常称为suspend)

How to prettify git log output方寸之间

4 formats git log --color --date=format:'%Y-%m-%d %H:%M

博客寄语:

    There are two wolves who are always fighting. One is darkness and despair. The other is light and hope. The question is... which wolf wins?

实时播报:

博客号-学习成长

相信每一分耕耘都有每一分收获,致力帮助博客主所创作的博客能更快的被收录! 如果有其它需求,可联系下方邮箱。