在C#中寻找非常大的项目的文本文件搜索算法

时间:2014-01-13 15:01:51

标签: c# algorithm file-io full-text-search

我正在尝试在C#中为一个非常大的项目(+ 700MB)编写一个搜索算法,并且由于我缺乏经验,我的代码在它结束/发现错误之前运行了超过30个小时。我不是要求任何人为我做这件事,而是要指出一个算法,这样我就可以学习,学习和实现它。

项目:我有一个包含许多键和值的文本文件(如加载文件),我们称之为 INI 文件。我还有一个庞大的项目,在许多文件夹中有很多文件。对于每个INI键,我必须:

1)搜索整个项目(而不是INI文件)以确保正在加载每个密钥。每个值都将使用名为 LoadIniValue()的函数单独加载。如果未在其中一个函数中调用某个值,我将不得不最终将其从INI文件中删除。

2)在此 LoadIniValue()函数中,您还拥有将存储值的容器,作为参数传递。使用该参数作为新的搜索键,它是否在项目中的任何位置(构造函数或析构函数除外)中使用?如果未使用(评估,读取等)参数,我将最终从INI文件中删除它。

这个项目的目标是拥有一个没有未使用参数的干净的INI文件。

我真的希望这将被视为一个有效的问题,并且有人能够提供线索。

非常感谢这个社区帮助我学习。你真是太棒了!

3 个答案:

答案 0 :(得分:3)

您需要一个索引代理。不要以为你需要自己设计它。 我会使用 Lucene 来索引这些文件并使用其API来获取输出。

答案 1 :(得分:0)

根据您的描述,您的代码会执行类似伪代码的操作:

foreach (entry in INI)
    foreach (file in ProjectFiles)
        Search for entry

如果是这种情况,您将在INI文件中搜索所有文件中的每个键。很可能你的文件没有那么大的变化,我们可以预期它们在你搜索这些值时根本不会改变。

然后,您只能在文件中运行一次,并在LoadIniValue()方法中构建所有已使用密钥的列表。接下来,您可以检查INI文件中的条目是否在使用的密钥列表中。如果不是,它可以被删除。这样可以减少必须读取的文件数量,减少IO的运行速度。

答案 2 :(得分:0)

看起来你需要两次通过。

在第一轮中,搜索所有源文件以查看对{​​{1}}的调用。存储正在使用的密钥的名称以及容器。在此过程结束时,您将获得代码中使用的LoadIniValue()对列表。

将其与INI文件中的键进行匹配。 INI中存在但不在key, container列表中的任何键未被使用。列表中但不在INI文件中的任何键可能都是错误。

现在进行第二次遍历源以确定列表中的哪些容器实际在构造函数和析构函数之外使用。

这应该很快执行。可能在10分钟或更短的时间内。你没有说700 MB中有多少文件,但我怀疑有不少文件。如果文件很小,那么您的主要瓶颈就是打开文件。使用我上面建议的方法,您只需要打开每个文件两次。如果我完全理解您的问题,那么您当前的实现是为每个INI键和每个容器名称打开每个文件。

如果您当前的代码有效且您只想加快速度,您可能只需将所有文件加载到内存中一次,然后在内存中进行所有搜索。这将消除多次打开和读取每个文件的开销。看到你的性能提升10倍,我不会感到惊讶。它不会像我上面提到的两遍解决方案那么快,但它可能已经足够好了。