在我的应用程序中,我需要大约每 50 毫秒在一个大文件(大约 2-7 GB)中连续写入数据 block (大约 2MB)。这是按顺序、循环方式完成的,所以我将一个 block 一个 block 地写入文件,当我到达文件末尾时,我从头开始重新开始。
目前我是这样做的:
在 C# 中,我调用 File.OpenWrite
一次以使用读取权限打开文件并使用 SetLength
设置文件的大小。当我需要写入 block 时,我将安全文件句柄传递给非托管 WriteFile
(kernel32.dll)。因此,我传递了一个重叠结构来指定文件中必须写入 block 的位置。我需要写入的 block 存储在非托管内存中,因此我有一个 IntPtr
,我可以将其传递给 WriteFile
。
现在我想知道是否以及如何使这个过程更有效率。有什么想法吗?
一些详细的问题:
- 从文件 I/O 更改为内存映射文件有帮助吗?
- 我可以包括一些针对 NTFS 的优化吗?
- 在创建我缺少的文件时是否有一些有用的参数? (可能是带有特殊参数的非托管调用)
最佳答案
使用更好的硬件可能是提高文件写入效率的最具成本效益的方法。 Microsoft Research 的一篇论文将回答您的大部分问题:Sequential File Programming Patterns and Performance with .NET和 downloadable source code (C#)如果你想在你的机器上运行论文中的测试。
简而言之:
- 默认行为可在单个磁盘上提供出色的性能。
- 如果您有磁盘阵列,则应测试无缓冲 IO。可以将写入速度提高八倍。
此线程在 social.msdn 上可能也有兴趣。
关于c# - HDD 高效连续数据写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17445782/