【问题标题】:Read-mostly data structure to compress and search source code主要用于压缩和搜索源代码的数据结构
【发布时间】:2014-11-05 01:42:00
【问题描述】:

假设您有大量流行语言(Java、C、C++ 等)的源代码(如 50GB+)。

项目需求是:

  • 压缩源代码以减少磁盘使用和磁盘 I/O

  • 以这样的方式对其进行索引,即可以从压缩源中提取特定的源文件,而无需解压缩整个文件

  • 整个代码库的压缩时间重要

  • 搜索和检索时间(以及搜索和检索时的内存使用)很重要

此 SO 答案包含潜在答案:What are the lesser known but useful data structures?

但是,这只是潜在的列表 - 我不知道这些结构实际上如何根据上面列出的要求进行评估。

问题:根据上述要求,哪些数据结构(及其实现)可以很好地执行?

【问题讨论】:

  • 在我看来,任何旧的 ZIP 存档都可以。
  • @JoachimPileborg 我可以在不解压缩整个 ZIP 的情况下搜索 LZ 压缩文本的内容以查找字符串吗?
  • 我会检查开源 Source Control 程序(如 SVN et simili)如何处理这个问题,我想他们有相同的要求并且很多人都在努力解决这些问题。 ..
  • 是的,ZIP 存档中的每个文件都经过压缩(或不压缩)并单独存储,因此您可以快速轻松地从存档中提取单个文件。 Read more about ZIP archives。有适用于所有主要操作系统的工具和库来处理 ZIP 档案。

标签: c++ data-structures indexing compression information-retrieval


【解决方案1】:

用于搜索的主要数据结构是inverted list。幸运的是,您不需要自己实现它。 Lucene 是一种广泛使用的搜索工具,可在内部使用倒排列表。

使用 Lucene,您可以创建一个包含多个字段的文档。这个想法是这些字段中的一些将是可搜索的标准关键字类型查询。

我已经实现了一个源代码搜索实用程序,我现在将在以下段落中简要介绍它。整个源代码本身存储为一个名为“code”的不可索引字段(您可以修改源以存储压缩版本)。

对于检索部分,请注意您将用于搜索的关键字可以是函数、类、包或变量的名称。它们也可能是来自 cmets 等的话。在我的实现中,我使用 Java 注释语法树 (AST) 提取了这些信息。您也可以通过使用适当的解析器来构造 AST 来对其他语言执行相同的操作。

另一种可能性是通过示例查询 (QBE) 范例,您可以使用一小段代码 sn-p 从索引代码库中搜索大致相似的 sn-ps。这对于检测源代码重用和抄袭特别有用,这是我开发该工具的主要目的。

项目页面是here。我称它为 YASOCS(Yet Another SOURce Code Searcher)。

搜索速度非常快,因为它使用倒排列表。您还可以使用Luke(一个开源 Lucene 索引可视化工具)自己“查看”索引并使用该界面执行测试查询。

【讨论】:

  • 谢谢,我现在正在查看它,但你没有许可证——这让你可能承担责任,因为甚至没有免责声明。 ;-)
  • 没有机会制定许可协议 :) 该软件旨在免费使用...
猜你喜欢
  • 2011-04-20
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多