Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中寻找超大项目的文本文件搜索算法#_C#_Algorithm_File Io_Full Text Search - Fatal编程技术网

C# 在C语言中寻找超大项目的文本文件搜索算法#

C# 在C语言中寻找超大项目的文本文件搜索算法#,c#,algorithm,file-io,full-text-search,C#,Algorithm,File Io,Full Text Search,我正试图为一个非常大的项目(+700MB)编写一个C#搜索算法,由于缺乏经验,我的代码在结束/发现错误之前运行了30多个小时。我不是要求任何人为我做这件事,而是给我指出一个算法,这样我就可以学习、学习和实现它 项目:我有一个包含许多键和值的文本文件(如加载文件),我们称之为INI文件。我也有一个巨大的项目,在许多文件夹中有许多文件。对于每个INI键,我必须: 1) 搜索整个项目(而不是INI文件),以确保每个键都已加载。每个值都将使用名为LoadIniValue()的函数分别加载。如果在这些函数

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

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

1) 搜索整个项目(而不是INI文件),以确保每个键都已加载。每个值都将使用名为LoadIniValue()的函数分别加载。如果在这些函数中没有调用某个值,我将不得不最终将其从INI文件中删除

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

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

我真的希望这将被认为是一个有效的问题,有人将能够提供线索


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

您需要一个索引代理。不要认为你需要自己从头开始设计。
我将使用Lucene为这些文件编制索引,并使用其api获取输出。

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

foreach (entry in INI)
    foreach (file in ProjectFiles)
        Search for entry
在这种情况下,您将在所有文件中搜索INI文件中的每个键。最有可能的是,您的文件没有太大的更改,我们可以预期,在您搜索值时,它们根本不会更改


然后,您只能在文件中运行一次,并在
LoadIniValue()
方法中构建所有已使用密钥的列表。接下来,您可以检查INI文件中的条目是否在used keys列表中。如果没有,可以将其移除。这将导致必须读取的文件减少,IO减少,运行速度更快。

看起来您需要分两次执行此操作

在第一步中,在所有源文件中搜索对
LoadIniValue()
的调用。存储正在使用的密钥的名称以及容器。在这个过程的末尾,您有一个代码中使用的
键、容器
对的列表

将其与INI文件中的键进行匹配。INI中存在但不在
键、容器
列表中的任何键都不会被使用。任何在列表中但不在INI文件中的键都可能是错误的

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

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


如果您当前的代码正常工作,并且您只想加快一点速度,那么您可以将所有文件加载到内存中一次,然后在内存中执行所有搜索。这将消除多次打开和读取每个文件的开销。我不会惊讶地看到,这将使您的性能提高10倍。它不会像我上面提出的双通道解决方案那样快,但可能已经足够好了。

我将使用数据库来代替;)@TimSchmelter:我想到了一个哈希表,但是由于项目在不断变化,这需要很多时间不?你能再解释一下吗?如果我理解正确(我很可能不理解),那么这里发生的事情就是打开项目中的每个文件,看看它是否包含.ini文件中的任何键。然后,任何找不到的值都应该从.ini文件中删除?这就是你的项目的本质吗?另外,您正在搜索的文件是什么样子的,每个单独打开的文件有多大?你现在如何在他们内部进行搜索?也许你试图解决错误的问题?如果您的项目从一个中心位置访问INI文件键,使用函数或属性访问这些值,那么您的IDE可以告诉您是否使用了这些函数中的任何一个(即让项目自行处理)。尽管如此,查看用于搜索的代码还是有帮助的。假设您有一个未排序的电话目录和一个未排序的电话列表,并且您想知道目录中有谁没有被呼叫过。描述一下你将如何手工解决这个问题,例如,纸上的列表。我不确定我是否可以,因为我的工作结果将被一家公司使用,但我会仔细研究