0

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

4

4 回答 4

2

Boyer-Moore在性能和复杂性之间提供了一个很好的折衷方案(链接的文章有其他方法的链接。

C 中的实现(链接中的源代码)将明显快于 C#,尽管在实践中您可能会发现磁盘 I/O 是最大的障碍。

于 2011-12-01T10:14:52.080 回答
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可以随意修改(增加)。

于 2011-12-01T10:13:09.550 回答
0

您必须加载整个文件才能搜索对象。如果可能的话,根据唯一 ID 拆分文件(如果有)。就像根据唯一 id 或其他一些参数为每 100 条记录(1-100、101-200、201-300 等)拆分一个文件。这是一种索引你的二进制文件。

于 2011-12-01T09:21:19.603 回答
0

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

于 2011-12-01T09:27:34.600 回答