首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提高文件拆分速度

提高文件拆分速度
EN

Stack Overflow用户
提问于 2013-02-10 12:13:03
回答 4查看 512关注 0票数 11

我正在使用此代码从文件中提取块

代码语言:javascript
运行
复制
// info is FileInfo object pointing to file
var percentSplit = info.Length * 50 / 100; // extract 50% of file
var bytes = new byte[percentSplit];
var fileStream = File.OpenRead(fileName);
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Dispose();
File.WriteAllBytes(splitName, bytes);

有什么方法可以加速这个过程吗?

目前,对于一个530MB的文件,大约需要4-5秒。这个时间还能改进吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-10 19:56:01

有几个案例你的问题,但没有一个是语言相关的。

下面是一些需要关注的事情

  • 源/目标文件的文件系统是什么?
  • 是否要保留原始源文件?
  • 它们是否位于同一驱动器上?

在c#中,你几乎没有比File.Copy更快的方法,它在内部调用WINAPICopyFile。然而,由于百分比是50%,遵循代码可能不会更快的。它复制整个文件,然后设置目标文件的长度

代码语言:javascript
运行
复制
var info=new FileInfo(fileName);
var percentSplit=info.Length*50/100; // extract 50% of file

File.Copy(info.FullName, splitName);
using(var outStream=File.OpenWrite(splitName))
    outStream.SetLength(percentSplit);

此外,如果

在文件驱动器与源驱动器相同后,您不能保留原始源

  • 您未使用启用加密/压缩的文件系统

然后,你能做的最好的事情就是,在中不要复制文件。例如,如果源文件位于FATFAT32文件系统上,则可以执行以下操作

  1. 为文件新拆分部分创建新的目录条目
  2. 让条目指向目标部分的群集
  3. 为每个条目设置正确的文件大小
  4. 检查交叉链接并避免

G237

如果您的文件系统是NTFS,那么您可能需要花费很长时间来研究该规范。

祝好运!

票数 8
EN

Stack Overflow用户

发布于 2013-02-26 02:27:58

代码语言:javascript
运行
复制
var percentSplit = (int)(info.Length * 50 / 100); // extract 50% of file
var buffer = new byte[8192];
using (Stream input = File.OpenRead(info.FullName))
using (Stream output = File.OpenWrite(splitName))
{
    int bytesRead = 1;
    while (percentSplit > 0 && bytesRead > 0)
    {
        bytesRead = input.Read(buffer, 0, Math.Min(percentSplit, buffer.Length));
        output.Write(buffer, 0, bytesRead);
        percentSplit -= bytesRead;
    }
    output.Flush();
}

刷新可能不需要,但不会造成伤害,这非常有趣,将循环更改为do-while而不是一段时间对性能有很大影响。我想IL没有那么快。我的pc在4-6秒内运行了原始代码,附加的代码似乎运行了大约1秒。

票数 2
EN

Stack Overflow用户

发布于 2013-02-11 20:21:14

在以几兆字节为单位进行读/写时,我得到了更好的结果。性能也会根据数据块的大小而变化。

代码语言:javascript
运行
复制
FileInfo info = new FileInfo(@"C:\source.bin");
FileStream f = File.OpenRead(info.FullName);
BinaryReader br = new BinaryReader(f);

FileStream t = File.OpenWrite(@"C:\split.bin");
BinaryWriter bw = new BinaryWriter(t);

long count = 0;
long split = info.Length * 50 / 100;
long chunk = 8000000;

DateTime start = DateTime.Now;

while (count < split)
{
    if (count + chunk > split)
    {
        chunk = split - count;
    }

    bw.Write(br.ReadBytes((int)chunk));
    count += chunk;
}

Console.WriteLine(DateTime.Now - start);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14794640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档