敢问作者,通过什么算法建立的索引,可快速找到指定文件名

敢问channing,从USN获取文件名后,通过什么算法建立的索引,可以这么快的查找到指定文件名?另外,listary是用什么语言写的?(c?c++?delphi…?)
另外,有用到汇编么?

1 Like

索引主要解决的是存储空间的问题(不然内存占用轻松上G),对搜索本身优化不大。

搜索时使用的是经过针对文件名调整优化过的Boyer–Moore算法,外加最大限度的使用多线程及各种缓存。

C++编写,没有用到汇编。

感谢,channing这么快速的无私的回答。最近对文件搜索比较感兴趣。也研究了一下everything、光速搜索的原理。

在网上找到了https://github.com/Artwalk/Fake-Everything,(仿everything)channing要是感兴趣,可以看看,我觉得不错。它用到了哈希表。
有机会,多交流交流

请教channing,listary感觉应该是程序发现编辑框(即关键字)有变化,那么开始执行“搜索”的线程,然后display出来。
我很好奇,假如某人输入一个文件名非常快,比如“A B“,这时候,当程序接收到”A“就执行搜索,而当”B“这个关键字来的时候,刚才”A“的搜索线程完全可能没有执行完,而“B”关键字又调用的搜索线程。
简单地说,“stc”和“isp”两个关键字都调用同一个搜索线程,为什么你的界面没有卡死的情况?也许程序可能在“B”关键字来之前,就强制结束了“A”的关键字,但是我们知道,强制结束线程也是需要时间的,如果”B“线程到来的时候,”A“的线程还没有结束掉,那么程序不就容易卡死么,但实际上listary并没有出现这种情况,想问channing是怎么实现的?
盼复
Listary的爱好者 2015-3-16 AM 7:16

请教channing,listary感觉应该是程序发现编辑框(即关键字)有变化,那么开始执行“搜索”的线程,然后display出来。
我很好奇,假如某人输入一个文件名非常快,比如“A B“,这时候,当程序接收到”A“就执行搜索,而当”B“这个关键字来的时候,刚才”A“的搜索线程完全可能没有执行完,而“B”关键字又调用的搜索线程。
简单地说,“stc”和“isp”两个关键字都调用同一个搜索线程,为什么你的界面没有卡死的情况?也许程序可能在“B”关键字来之前,就强制结束了“A”的关键字,但是我们知道,强制结束线程也是需要时间的,如果”B“线程到来的时候,”A“的线程还没有结束掉,那么程序不就容易卡死么,但实际上listary并没有出现这种情况,想问channing是怎么实现的?
盼复
Listary的爱好者 2015-3-16 AM 7:16

1 Like

界面及显示部分由一个单独的UI线程负责。例如用户输入“A”,UI线程就负责把“A”显示在搜索框中;用户输入“A B”,就在搜索框中直接显示“A B”,这个UI线程仅负责界面部分,实际上这时候真正的搜索工作在屏幕上显示“A B”时可能完全没有开始。当搜索真正完成时,搜索线程会通知这个UI线程更新搜索结果的显示。

那如何控制“搜索线程”和“UI线程”的关系呢?因为我们无法决定CPU的分配情况,打个比方,比如CPU很傻,UI线程用90%CPU,主线程(也就是搜索线程)用10%CPU,这显然是不行的,但我们并不能排除CPU这么分配任务的。
问题:
1、用什么方法,可以避免CPU花大量时间去运行次要的线程(这里是UI线程)?
2、“UI线程”和“搜索线程(主线程)”,都会涉及全局共享变量的操作,难道就不怕“搜索线程(主线程)”处理全局变量的时候,UI正在使用这些全局变量吗?

  1. 线程可以直接指定优先级,系统会根据优先级分配CPU。不指定优先级的话基本是平均分配CPU的,不会出现你说的那种情况。
  2. 请搜索“线程间同步”。多线程间共享资源有很多成熟的方案。
1 Like

orz 都好厉害