我使用动态分段算法(如IDM)开发了一个下载管理器 对于大文件,因为多段下载,线程写入文件的不同空间,可能有4GB距离。 因为写作性能下降很多。 我不知道如何快速写入这些数据 我试过win api WriteFile而不是Stream.Write但是我发现这个问题非常多硬盘头部运动 我在内存中为每个段尝试了MemoryMappedFile和5MB ViewStream,写入速度提高但不像我预期的那样 使用MemoryMappedFile的psudo代码是这样的。也许我使用MemoryMappedFile的方法不正确
create MemoryMappedFile
for each segment
create 5MB ViewStream
write to memory stream
if data passed 5 MB or passed end of segment then close ViewStream and Create new ViewStream if not passed end of segment
答案 0 :(得分:1)
我建议您使用标准的 Stream 实现而不是WinAPI。而不是写入单个文件 - 尝试写入不同的文件,然后将它们合并在一起。通过这种方式,硬盘驱动器可以在没有“寻找”的情况下进行写入。操作到文件中的具体位置(这可能是写作速度太慢的原因)。
关于你跨越5 GB的问题 - 首先是HDD问题,它有自己的缓冲区来解决这些问题并且很好地解决了它。
当您编写许多小文件时,HDD会决定如何在缓冲区中重新排列其内容以提高效率。例如,它可以在缓冲区中存储数据块,并且当时间到了写入一些数据时 - 它将一次写入(一个圆圈)。如您所见,它也可以帮助您多线化您的作品,因为您在缓冲区中写入完全不同的位置。