【问题标题】:how to improve a large number of smaller files read and write speed or performance如何提高大量较小文件的读写速度或性能
【发布时间】:2012-01-31 18:32:24
【问题描述】:

昨天,我在这里提问:how do disable disk cache in c# invoke win32 CreateFile api with FILE_FLAG_NO_BUFFERING

在我的性能测试显示(读写测试,1000 个文件,总大小 220M)中,FILE_FLAG_NO_BUFFERING 无法帮助我提高性能并低于 .net 默认磁盘缓存,因为我尝试将FILE_FLAG_NO_BUFFERING 更改为FILE_FLAG_SEQUENTIAL_SCAN 可以达到.net默认磁盘缓存,速度快一点。

之前,我尝试用mongodb的gridfs特性替换windows文件系统,效果不好(而且我不需要使用分布式特性,只是尝尝)。

在我的产品中,服务器每秒可以通过 tcp/ip 获取大量较小的文件(60-100k),然后需要将其保存到磁盘,第三个服务读取这些文件一次(只需读取一次和过程)。如果我使用异步 I/O 是否可以帮助我,是否可以获得最佳速度和最佳低 CPU 周期?有人可以给我建议吗?或者我仍然可以使用 FileStream 类?

更新 1

内存映射文件能否达到我的要求。所有文件写入一个或多个大文件并从中读取?

【问题讨论】:

  • 如果只处理一次,真的有必要将这些文件写入磁盘吗?
  • 只需转到您的问题并通过选中 anwes 旁边的“右箭头”来标记帮助您完成任务的答案... :-)
  • @Pankaj Upadhyay,谢谢,我解决了。我会注意的。
  • 从您对 Tigran 帖子的评论中可以清楚地看出您正在尝试解决错误的问题。您必须限制客户端,以防止它们以高于您可以处理的速度上传文件。如果这不可接受,那么您将需要在问题上投入硬件。

标签: c# .net performance io filesystems


【解决方案1】:

如果您的 PC 需要 5-10 秒将 100kB 文件写入磁盘,那么您要么拥有世界上最古老、最慢的 PC,要么您的代码执行的效率非常低。

关闭磁盘缓存可能会使事情变得更糟而不是更好。有了磁盘缓存,您的写入速度会很快,而 Windows 将在稍后将数据刷新到磁盘的速度较慢。事实上,一般来说,增加 I/O 缓冲通常会显着改善 I/O。

您肯定希望使用异步写入 - 这意味着您的服务器开始写入数据,然后在操作系统处理在后台将数据写入磁盘时返回响应其客户端。

不应该对写入进行排队(因为如果启用了磁盘缓存,操作系统已经这样做了),但是如果所有其他方法都失败了,你可以尝试这样做 - 只写一个可能会有所帮助一次文件,以尽量减少磁盘寻道的需要..

通常对于 I/O,使用更大的缓冲区有助于提高吞吐量。例如,不是在循环中将每个单独的字节写入文件,而是在一次写入操作中写入一个缓冲区的数据(理想情况下是整个文件,对于您提到的大小)。这将最大限度地减少开销(而不是为每个字节调用一个写入函数,而是为整个文件调用一次函数)。我怀疑你可能正在做这样的事情,因为我知道这是将性能降低到你建议的水平的唯一方法。

内存映射文件对您没有帮助。它们非常适合访问大文件的内容。

【讨论】:

  • 嗨,@Jason Williams,感谢您的建议。它让我清楚该怎么做,谢谢。
【解决方案2】:

在您的情况下,最严重的重大改进之一是,imo 处理填充物而不将它们保存到磁盘,然后,如果您确实需要存储它们,请将它们推送到 @ 987654321@ 并在另一个线程中通过将它们保存在磁盘上来证明它。通过这样做,您将立即获得所需的已处理数据,而不会浪费时间将数据保存在磁盘上,而且之后还会在磁盘上保存文件,而不会失去 file processor 的计算能力。

【讨论】:

  • 嗨,@Tigran,在我也考虑使用 Queue.but 之前,客户端在多线程中每秒发送 20-30 个文件,服务器处理一个文件需要 5-10 秒,如果大量文件保存在内存中,会抛出 memoryleak 异常。
  • 从一个地方你可以从另一个线程加载到queue,保存到磁盘并从队列中删除。不要填充 ALL 并在处理后处理它,而是在运行期间处理。
猜你喜欢
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多