我正在寻找最快和最好的算法来将一些值搜索成一个非常庞大的二进制文件(一种2 GB AFP文件),这意味着将整个数据加载到内存中必定是不可思议的。我正在使用C#,我不知道是否有任何其他编程语言(C / C ++ ..)会更快,否则我将继续使用C#。 谢谢你的任何想法。
答案 0 :(得分:2)
Boyer-Moore在性能和复杂性之间提供了良好的折衷(链接的文章与其他方法有关。
C中的实现(链接中的源代码)将明显快于C#,尽管在实践中你可能会发现磁盘I / O是最大的障碍。
答案 1 :(得分:1)
评论后,我决定提供一个可能的解决方案 小心:这个解决方案不是最好的也不是优雅的 以此为出发点:
string SEARCH = @"X'D3A8AF";
int BUFFER = 1024;
int tot = 0;
using (FileStream fs = new FileStream(filename, FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs))
{
char[] buffer = new char[BUFFER];
int pos = 0;
while (fs.Position < fs.Length)
{
sr.ReadBlock(buffer, 0, BUFFER);
string s = new string(buffer);
int i = 0;
do
{
i = s.IndexOf(SEARCH, i);
if (i >= 0) { tot++; i++; }
}
while (i >= 0);
pos += BUFFER;
if (!s.EndsWith(SEARCH)) pos -= SEARCH.Length;
fs.Position = pos;
}
sr.Close();
}
fs.Close();
}
BUFFER
可以随意修改(增加)。
答案 2 :(得分:0)
您必须加载整个文件才能搜索该对象。如果可能的话,根据唯一ID分割文件。就像根据唯一的id或其他一些参数分割每100条记录(1-100,101-200,201-300等)的文件一样。它有点索引你的二进制文件。
答案 3 :(得分:0)