最快的搜索算法到二进制文件?

时间:2011-12-01 09:17:31

标签: c# algorithm search binary afp

我正在寻找最快和最好的算法来将一些值搜索成一个非常庞大的二进制文件(一种2 GB AFP文件),这意味着将整个数据加载到内存中必定是不可思议的。我正在使用C#,我不知道是否有任何其他编程语言(C / C ++ ..)会更快,否则我将继续使用C#。 谢谢你的任何想法。

4 个答案:

答案 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)

您可以使用TextReader。ReadBlock方法。 逐块读取文件并查找请求的值。 或者甚至更好地使用BinaryReader。ReadBytes方法。