gpt4 book ai didi

.net - 在.NET中读写磁盘最快的方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:15:23 30 4
gpt4 key购买 nike

我有一个小程序,可以在磁盘上读写文件。将其分解为最简单的级别,它从一个文件流读取字节,然后将它们写入另一个文件流。它可以很好地履行职责,但这并不是最快的事情。

我见过其他应用程序可以惊人的速度破坏千兆字节或更多的读/写操作。显然,它们比.NET应用程序更接近金属。

什么是最有效的.NET API,用于与磁盘进行流传输/从磁盘流传输?哪些win32 API可用于(并且值得调用)进行快速磁盘访问?

最佳答案

快速文件I/O与您进行的特定API调用无关,而与您如何设计应用程序以与I/O一起使用有关。

例如,如果要在单个线程上按顺序执行所有I/O操作

  • 将块读入内存
  • 以某种方式在内存中的处理块
  • 将阻止写入文件
  • 重复直到完成...

  • 您在单个线程的处理循环中正在瓶颈系统的I/O带宽。另一种更复杂的设计是对应用程序进行多线程处理,以最大化吞吐量并避免等待时间。这使系统可以同时利用CPU和I/O Controller 的带宽。一个典型的设计如下所示:
  • 一个(或多个)辅助线程从磁盘读取数据并将其添加到共享输入队列
  • 一个(或多个)工作线程从共享输入队列中读取块,对其进行处理并将其添加到共享输出队列中
  • 一个(或多个)工作线程从共享输出队列中读取已阻止的已处理线程,并将它们写入相应的输出文件。

  • 这不是一个易于设计的体系结构,需要大量考虑才能避免创建内存中的锁争用,或避免因并发I/O请求而使系统不堪重负。您还需要提供控制元数据,以便不在线程的调用堆栈上而是在输入/输出工作队列中管理输出处理的状态。您还必须确保以正确的顺序转换和写入输出,因为使用多线程I/O不能确保工作以保证的顺序放在输入队列中。它很复杂-但有可能,并且与串行方法相比,吞吐量可能有巨大差异。

    如果您真的有时间并且想从系统中获取每盎司的性能,则还可以使用 I/O completion ports(一种相对较低级别的API)来最大化吞吐量。

    祝你好运。

    关于.net - 在.NET中读写磁盘最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1084927/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com