c# - 在 C# 中处理大文件

标签 c# byte large-files replace

我有一个 4Gb 的文件,我想对其执行基于字节的查找和替换。我已经编写了一个简单的程序来执行此操作,但仅执行一个查找和替换操作所需的时间太长(90 分钟以上)。我尝试过的一些十六进制编辑器可以在 3 分钟内完成任务,并且不会将整个目标文件加载到内存中。有谁知道我可以完成同样事情的方法吗?这是我当前的代码:

    public int ReplaceBytes(string File, byte[] Find, byte[] Replace)
    {
        var Stream = new FileStream(File, FileMode.Open, FileAccess.ReadWrite);
        int FindPoint = 0;
        int Results = 0;
        for (long i = 0; i < Stream.Length; i++)
        {
            if (Find[FindPoint] == Stream.ReadByte())
            {
                FindPoint++;
                if (FindPoint > Find.Length - 1)
                {
                    Results++;
                    FindPoint = 0;
                    Stream.Seek(-Find.Length, SeekOrigin.Current);
                    Stream.Write(Replace, 0, Replace.Length);
                }
            }
            else
            {
                FindPoint = 0;
            }
        }
        Stream.Close();
        return Results;
    }

顺便说一句,与 4Gb"file"相比,查找和替换相对较小。我可以很容易地看出为什么我的算法很慢,但我不确定如何才能做得更好。

最佳答案

部分问题可能是您一次读取一个字节的流。尝试读取更大的 block 并对其进行替换。我会从大约 8kb 开始,然后用一些更大或更小的 block 进行测试,看看什么能带来最佳性能。

关于c# - 在 C# 中处理大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10387772/

相关文章:

asp.net-mvc-4 - System.OutOfMemoryException : Exception of type 'System.OutOfMemoryException' was thrown.在mvc 4中下载大文件

c# - 使用 Azure ARM 模板和 C# 进行部署时设置调试级别

c# - 来自具有不同类型数据的字节数组的 MemoryStream

c# - 如何覆盖数据网格列标题的自动创建?

大字节的java Inputstream然后是127

c - 将字节值存储在 char* 中

c++ - 如何处理大图像?

ssl - 如何有效地将一个大文件从CMS广播到局域网中的n个客户端

c# - 反序列化 RD.Details 类型的对象时出错。 '�19.95 Per Person' 包含无效的 UTF8 字节

c# - 指数数组的边界之外。尽管我试图阻止它