gpt4 book ai didi

c# - 如何尽可能高效地处理大量并发磁盘写请求

转载 作者:太空狗 更新时间:2023-10-29 17:48:38 24 4
gpt4 key购买 nike

假设下面的方法被 .net 4 应用程序中的不同线程调用了数千次。处理这种情况的最佳方法是什么?明白磁盘是这里的瓶颈,但我希望 WriteFile() 方法能够快速返回。

数据可以达到几 MB。我们是在谈论线程池、TPL 还是类似的东西?

public void WriteFile(string FileName, MemoryStream Data)
{
try
{
using (FileStream DiskFile = File.OpenWrite(FileName))
{
Data.WriteTo(DiskFile);
DiskFile.Flush();
DiskFile.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}

最佳答案

如果您想快速返回并且不太关心操作是否同步,您可以在内存中创建某种Queue,您将在其中放置写入请求,当队列未满时您可以快速从方法返回。另一个线程将负责调度 Queue 和写入文件。如果你的 WriteFile 被调用并且队列已满,你将不得不等到你可以排队并且执行将再次同步,但是这样你就可以有一个大缓冲区,所以如果进程文件写入请求不是线性的,但更尖锐(在写入文件调用尖峰之间有暂停)这种变化可以看作是性能的改进。

更新:给你拍了一张小图。请注意,瓶颈始终存在,您所能做的就是使用队列优化请求。请注意,队列有限制,因此当它填满时,您无法将文件插入队列,您必须等待,以便该缓冲区中也有可用空间。但是对于图片中呈现的情况(3 个桶请求),很明显您可以快速将桶放入队列并返回,而在第一种情况下您必须一个一个地执行并阻止执行。

请注意,您永远不需要同时执行许多 IO 线程,因为它们都将使用相同的瓶颈,如果您尝试如此大量地并行,您只会浪费内存,我相信 2 - 10 个线程顶部将占用所有可用的IO 带宽很容易,并且也会限制应用程序内存使用。

enter image description here

关于c# - 如何尽可能高效地处理大量并发磁盘写请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421797/

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