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

发布于 2024-12-18 23:29:54 字数 140 浏览 0 评论 0原文

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

I'm looking for the fastest and the best algorithm to search some values into a very huge binary file (kind of 2 GB AFP file), wich means that loading the whole data in memory must be inconceivable. I'm working with C# and i don't know if any other programing language (C/C++..) would be really much faster, otherwise i'll continue with C#.
Thanks for any ideas.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天荒地未老 2024-12-25 23:29:54

Boyer-Moore 在性能和复杂性(以及链接的文章中有其他方法的链接。C

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

Boyer-Moore offers a good compromise between performance and complexity (and the linked articles has links to other methods.

An implementation in C (source code in link) will be significantly faster than C#, although in practice you'll probably find that disk I/o is the biggest hurdle.

岁月无声 2024-12-25 23:29:54

经过评论,我决定提供一个可能的解决方案。
请注意:这个解决方案不是最好的,也不是优雅的。
使用它作为起点:

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

After commenting, I decided to provide a possible solution.
Be careful: this solution is not the best nor elegant.
Use it as a starting point:

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 could be modified (increased) as you please.

清醇 2024-12-25 23:29:54

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

You have to load entire file to search the object. If possible split the files based on unique id's if you have. Like split a file for each 100 records (1-100, 101-200, 201-300 etc) based on unique id's or some other params. It is kind of indexing your binary file.

情仇皆在手 2024-12-25 23:29:54

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

You can use TextReader.ReadBlock Method.
Read the file block by block and look for the requested values.
Or even better use BinaryReader.ReadBytes Method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文