当前位置: 首页 > 编程语言 > C#

在C#中处理大文件共享

时间:2023-04-10 18:17:59 C#

在C#中处理大文件我有一个4Gb文件,我想执行基于字节的查找和替换。我已经编写了一个简单的程序来执行此操作,但是仅执行一次查找和替换就需要很长时间(90分钟以上)。我试过的一些十六进制编辑器可以在3分钟内完成这项工作,并且不会将整个目标文件加载到内存中。有谁知道我可以完成同样的事情的方法吗?这是我当前的代码:publicintReplaceBytes(stringFile,byte[]Find,byte[]Replace){varStream=newFileStream(File,FileMode.Open,FileAccess.ReadWrite);int查找点=0;int结果=0;for(longi=0;iFind.Length-1){结果++;查找点=0;Stream.Seek(-Find.Length,SeekOrigin.Current);Stream.Write(Replace,0,Replace.Length);}}else{FindPoint=0;}}Stream.Close();返回结果;顺便说一句,与4Gb的“文件”相比,查找和替换相对较小。我很容易理解为什么我的算法很慢,但我不确定如何才能让它变得更好。部分问题可能是您一次只读取一个字节流。尝试读取更大的块并替换它们。我会从大约8kb开始,然后测试一些更大或更小的块,看看什么能给你最好的性能。有很多更好的算法可以从这里找到字符串中的子字符串(这基本上就是你正在做的):http://en.wikipedia.org/wiki/String_searching_algorithm它们的要点是通过分析子字符串字符串可以跳过很多字节。这是一个4GB文件开头的简单示例:ABCDEFGHIJKLMNOP您的子字符串是:NOP跳过substring-1的长度并检查最后一个字节,因此将C与P进行比较它不匹配,因此子字符串不在3个字节之前另外,C根本不在子串中,所以可以跳过3个字节(子串的len)比较F和P,不匹配,F不在子串中,跳过3比较I和P等。如果匹配,则向后走.如果字符不匹配,但在子字符串中,那么您必须在此时进行更多比较(阅读链接了解详细信息)而不是逐字节读取文件,而是在缓冲区中读取它:buffer=newbyte[缓冲区大小];当前位置=0;length=(int)Stream.Length;while((count=Stream.Read(buffer,currentPos,bufferSize))>0){currentPos+=count;....}另一种更简单的方法是一次读取多个字节:varStream=newBufferedStream(newFileStream(File,FileMode.Open,FileAccess.ReadWrite));将此与SaeedAmiri关于如何读入缓冲区的示例相结合,更好的二进制查找/替换算法之一应该会给您带来更好的结果。您应该尝试内存映射文件。C#从4.0版开始支持它们。内存映射文件包含虚拟内存中的文件内容。持久文件是与磁盘上的源文件关联的内存映射文件。当最后一个进程使用完该文件后,数据将保存到磁盘上的源文件中。这些内存映射文件适用于处理非常大的源文件。以上就是C#学习教程:C#处理大量文件共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: