c# - 如何优化具有大文件 I/O(读取、写入)和计算的例程?

标签 c# performance .net-4.0

我知道他们说过早的优化是万恶之源……但现在正是时候。

我有一个执行以下操作的缓慢但有效的过程:

  1. 从 file.input 中读取 block (顺序)
  2. 转换 block
  3. 将转换后的 block 写入(追加)到 file.output

file.input 和 file.output 最终大小相同(10-100+ GB)。一个 block 通常约为 10K。转换步骤只是专有格式之间的转换。为了便于讨论,我们可以认为它在计算上与实时压缩算法不相上下。

这些步骤目前在单个线程中完成。

我的问题:如何使它的性能更好?

我意识到,根据正在处理的纯数据量,这永远不会变得“快”,但我必须相信有一些相对简单和标准的技术可以使它更快。

我已经尝试在读取步骤 (1) 中添加缓冲。也就是说,读取比 block 大小大得多的 block 并从缓冲区读取。这有帮助。但是,我对是否可以为转换步骤 (2) 和附加 (3) 做任何事情感到困惑。

根据资源监视器,我的 CPU 使用率在 30-45% 之间波动,磁盘 I/O 有一些持续的低使用率。

我正在使用 C# 和一堆 P/invoke 互操作到 native 库。

最佳答案

首先,您应该验证所有步骤是否都占用了大部分时间 - 如果瓶颈证明只是一个步骤,那么我们在这里看错了图。

磁盘 I/O 可能需要一段时间,在此期间 CPU 可用于其他任务,因此多线程解决方案可以提高性能。也许您可以使用一个线程来不断填充缓冲区,最多 10 个可处理数据 block ,一个处理第一个加载的任何 block ,另一个只写入任何已完成处理的 block 。然后,一对 AutoResetEvents 可以通知每个线程前一个线程已完成处理一个或多个 block 。

关于c# - 如何优化具有大文件 I/O(读取、写入)和计算的例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199421/

相关文章:

c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?

sql - 简单更改到查询对性能造成影响

android - 获取大量数据会抛出光标窗口 : Window is full error

c# - 使用单一服务在 Linux 上测试 Windows DOTNET 服务

.net - 如何用所需字符填充字符串

c# - 在c#中处理大量excel工作簿时如何跳过一些受密码保护的excel文件

c# - MS Word 中的语法高亮显示

c# - MonoTouch 异常 : Selector invoked from objective-c on a managed object of type that has been GC'ed

c# - 在 wpf 程序中包含数据库的最佳方法?

c# - 测试蜂窝网络上的互联网连接