假设您在流行语言(Java,C,C ++等)中有很多源代码(如50GB +)。
项目需求是:
压缩源代码以减少磁盘使用和磁盘I / O
以这样的方式索引它,即可以从压缩源中提取特定的源文件而不解压缩整个事物
整个代码库的压缩时间不重要
搜索和检索时间(以及搜索和检索时的内存使用)很重要
此SO答案包含可能的答案:What are the lesser known but useful data structures?
然而,这只是一个潜在的列表 - 我不知道这些结构如何实际评估上面列出的要求。
问题:根据上述要求,哪些数据结构(及其实现)表现良好?
答案 0 :(得分:1)
用于搜索的主要数据结构是inverted list。幸运的是,您不需要自己实施它。 Lucene是一种广泛使用的搜索工具,可在内部使用反向列表。
使用Lucene,您可以创建包含多个字段的文档。我们的想法是,其中一些字段将是可搜索的,并带有标准的关键字类型查询。
我已经实现了源代码搜索实用程序,我现在将在以下段落中简要介绍。整个源代码本身存储为一个名为" code"的非索引字段。 (您可以修改源以存储压缩版本。)
对于检索部分,请注意您要用于搜索的关键字可以是函数,类,包或变量的名称。它们也可以是评论中的文字等等。在我的实现中,我使用Java注释语法树(AST)提取了这些信息。您可以通过使用适当的解析器来构建AST来为其他语言执行相同的操作。
另一种可能性是按示例查询(QBE)范例,您可以使用一小段代码从索引代码库中搜索大致相似的代码段。这对于检测源代码重用和剽窃特别有用,这是我开发该工具的主要目的。
项目页面为here。我称之为YASOCS(又一个SOurce Code Searcher)。
搜索速度非常快,因为它使用了倒置列表。您还可以使用Luke(一个开源的Lucene索引可视化工具)来查看"自己索引并使用接口执行测试查询。