intellij-idea IntelliJ IDEA如何在磁盘上存储搜索索引?

9jyewag0  于 2022-11-01  发布在  IntelliJ IDEA
关注(0)|答案(1)|浏览(258)

我知道IDEA为搜索功能构建了所有标记(单词)的倒排索引。例如,对于“Find in files”和regex搜索,它使用三元组索引(参见WikiIDEA sources)。
我也知道这个索引可能非常大,所以它肯定必须存储在硬盘上,因为它不能完全装入RAM。而且当执行搜索操作时,它应该迅速加载到RAM中。
我发现他们使用外部化(参见IDEA sources)方法来对serialize and deserialize索引数据进行索引实现。

问题:

  1. IDEA是在内存中缓存索引,还是为每个搜索操作加载索引数据?
    1.如果(1.)为真,IDEA如何决定哪些索引保留在内存中,哪些应该清除?换句话说,使用哪个cache replacement policy
  2. repository中用于在HDD上存储和读取索引的代码在哪里?
    1.(可选)HDD上存储的索引格式是什么?是否有文档?
wtzytmuj

wtzytmuj1#

我将尝试以相同的顺序发布我的答案
1.在浏览完整个项目之后,我们将所有的正向和反向索引写入磁盘。(存储在内存中),但不包括VirtualFile的内容(存储在磁盘上)。为了解决这个问题,磁盘上有大量的索引,反映物理文件的状态(VirtualFile表示法),而对于Document和PsiFile表示法,则有一个额外的内存中索引。当查询索引时,首先查询最新的内存中索引,然后从主磁盘索引和该高速缓存中检索其余键。
1.可以在IDE系统目录https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs中找到位于磁盘上的索引
1.我建议仔细研究com.intellij.util.indexing.IndexInfrastructure和com.intellij.util.indexing.FileBasedIndex方法的用法,这些类处理文件路径,并有处理和阅读索引的方法。
1./index目录的内容取决于项目。
此外:如果用户编辑一个文件,我们不会为它创建索引,直到我们需要它们,例如,直到一个特定键的值被请求。如果在编辑文件时调用findUsages命令,额外的索引只会在那一刻发生。然而,这样的情况几乎是不可能的,因为文件被频繁地写入磁盘,全局索引是在发生变化时运行的。

相关问题