gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:49 24 4
gpt4 key购买 nike

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

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

  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/

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