【问题标题】:Optimizing File Operations优化文件操作
【发布时间】:2015-03-08 07:49:39
【问题描述】:

我有一个 C# 应用程序,它涉及到很多文件操作,即读取、移动、删除、追加等。例如,从本地 FS 上的源路径读取文件,经过处理后,它是从那里删除并将处理后的文件写入本地 FS 上的目标位置。这一切都是在一组系统上并行完成的,每个系统只处理本地文件。 (文件由负载均衡器在它们之间分配)

我怎样才能提高这个应用程序的性能?

我能想到的有:

1.) 为特定类型的操作(例如删除)创建队列。将所需的信息放入队列中,一个单独的线程将处理队列。

2.) 不要使用 FS,而是使用内存中的数据存储,例如 Redis。由于数据将在缓存中,因此操作会更快。

3.) 增加代码的并行度。每个线程将处理单独的文件,并且应该更快。

上述方法会奏效吗?请提出任何其他可能值得考虑的替代方案。

【问题讨论】:

  • 除非您正在处理多个物理硬盘驱动器,否则并行性对您没有任何好处。告诉驱动器一次做 3 件事只会涉及其中 2 件事等到第一件事完成,而不是 3 倍加速。
  • @Servy,所以你说物理硬盘上实际上只能发生一个操作,即使这些操作涉及不同的文件。
  • @ptntialunrlsd 硬盘只有一个磁头,所以是的,它一次只能读/写一个文件,除非你有多个驱动器。您正在处理多个文件并不会改变这一点。

标签: c# multithreading redis filesystems asynchronous


【解决方案1】:

1.)我建议将常见的上下文操作批处理在一起,以减少同步\上下文切换开销并利用处理器的缓存机制。 2.) 将文件组合到一个文件中将减少 Windows 握手每个文件的性能损失。 3.) 尝试使用指针和\或 Win32 API,它们在许多情况下似乎比它们的托管包装器\lib 实现更快。 4.) 阻塞收集队列(生产者消费者)可能是一个很好的起点。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2014-11-14
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多