c# - HDD 高效连续数据写入

标签 c# c file-io memory-mapped-files

在我的应用程序中,我需要大约每 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 .NETdownloadable source code (C#)如果你想在你的机器上运行论文中的测试。

简而言之:

  • 默认行为可在单个磁盘上提供出色的性能。
  • 如果您有磁盘阵列,则应测试无缓冲 IO。可以将写入速度提高八倍。

此线程在 social.msdn 上可能也有兴趣。

关于c# - HDD 高效连续数据写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17445782/

相关文章:

c# - 从 JSON.net 中的 JArray 获取值

c - 获取文件中元素的数量

java.security.AccessControlException : Access denied (java. io.FilePermission

c# - TSQL 从列可能不存在的临时表插入

c# - 如何创建 JSON.NET 日期到字符串自定义转换器

c# - 如何在WPF中的鼠标双击事件中获取datagrid中的cellvalue

c - 递归读取数组

c - 将 VP9 编码数据混合到 .webm 时 FPS 不正确

c - MSVC : Error mapping a structure to an array of offsetof

VB.NET 重命名文件和重新标记/编辑图像元数据/元标记