使用内存映射文件的缺点

2024-01-05

我的网络服务每分钟写入数千笔交易,我们将它们保存在硬盘上。

我正在测试保存这些文件的不同方法,并使用标准 IO 和 MemoryMapped 文件进行了一些测试。在我的结果中,使用 MemoryMapped 文件写入文件(20 k 文本文件)大约比标准 IO 快 4 倍,而且我没有发现任何缺点。

由于我对这项技术没有太多经验,您认为我在使用它们时可能会遇到任何问题,或者您没有看到任何缺点吗?

谢谢!

EDIT 1,这里是来源:

namespace FileWritingTests.Writers {
    public class MappedFileWriter : ITestWriter {
        public void Write(string content, string path,string id) {
            Byte[] data = System.Text.Encoding.UTF8.GetBytes(content);

            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None))

            using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, id, data.Count(),
                MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true)) {
                var viewStream = memoryMapped.CreateViewStream();
                viewStream.Write(data, 0, data.Length);                       
            }
        }
    }
}

这是测试仪:

  public TimeSpan Run(int iterations, Writers.ITestWriter tester, String subfolder) {
            Console.WriteLine(" -- Starting test {0} with {1} file writings",subfolder, iterations.ToString());

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Reset();
            stopWatch.Start();
            for (int i = 1; i <= iterations; i++) {
                tester.Write(transaction, this.path + "\\" + subfolder + "\\" + "file_" + i.ToString() + ".txt", i.ToString());
            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;

            Console.WriteLine(" -- finish test {0} with {1} file writings. Time Elapsed: {2}", subfolder, iterations.ToString(), ts.TotalMilliseconds);
            return ts;
        }

测试器被调用多次,并且有多种类型的测试器被调用进行比较。


MMF 的主要缺点是它们会消耗 RAM,从而降低文件系统缓存的效率。如此小的文件不是问题。

另一个缺点(尽管肯定是故意的)是您无法再测量写入文件的成本。现在,这是由内核完成的工作,不再是您的程序了。当然,这仍然在进行,天下没有免费的午餐。它与程序的其余执行是并发的,可以说是自由线程。密切关注任务管理器中“系统”进程的 CPU 利用率。同样,如此小的文件不太可能出现问题。

这是一种微观优化,被创建文件的成本所震惊。在主轴磁盘驱动器上,该时间徘徊在 20 到 50 毫秒之间。不要忘记将其包含在您的测量中。写入文件数据以内存总线速度运行,最高可达 5 GB/秒,具体取决于机器具有的 RAM 类型。您删除的只是低级 WriteFile() 调用,它们现在由内核完成。您可以尝试使用 FileStream 进行测试,使用采用以下参数的构造函数缓冲区大小价值。默认值为 4096 字节,将其增加到 32K,这样就只有一次 WriteFile() 调用。这样做的主要优点是您不必预先猜测 MMF 的大小。当你猜得太低时,事情会变得非常难看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内存映射文件的缺点 的相关文章

  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • 将对象实例写入 C# 的工具(用于单元测试)

    假设我有一个接受对象列表的方法 该方法通常可以轻松处理 20 个对象 每个对象都有大约 15 个属性 为了对此进行单元测试 我需要输入所有 20 个对象 以便可以将它们传递到我的方法中 当我可以在调试器监视窗口中看到我需要的完美示例时 这真
  • 加载共享库时出错,无法打开共享对象文件:没有这样的文件或目录(hiredis)

    我正处于编写一个在后端使用 redis 的 C 程序的 alpha 阶段 我尝试过构建 安装hiredis make sudo make install 并运行测试 大部分通过 但是当尝试构建示例 c https github com re
  • Laravel 护照范围

    我对 laravel 范围部分有点困惑 我有一个用户模型和表 如何为用户分配用户 客户和 或管理员的角色 我有一个带有 vue 和 laravel api 后端的 SPA 我用https laravel com docs 5 3 passp
  • Android 版 Canvas 中的撤消和重做

    我正在使用定制版本指甲油 http developer android com resources samples ApiDemos src com example android apis graphics FingerPaint htm
  • 如何在 ASP.net core 中按请求缓存

    我的旧代码如下所示 public static class DbHelper One conection per request public static Database CurrentDb if HttpContext Current
  • JavaScript 中的变量有多昂贵?

    局部变量有多昂贵 var v 全局变量 window v 和跨全局变量 parent v 在 JavaScript 中 在主要浏览器中 有人对此进行过良好的测试吗 忽略解释器 解析器的优缺点 重要的是运行时必须查看作用域链的各个部分的程度
  • 带钩子的应用程序加载启动画面

    在使用带钩子的功能组件时 如何实现加载资源的同时显示闪屏 使用带有钩子的应用程序加载和 或启动屏幕的模式是什么 Thanks Bill 如果你只明白Hook s useState 这是一个非常容易的改变 这可以简单地转换为函数 并使用以下方
  • 如何设计协议缓冲区中未来的附加枚举值?

    Protocol buffers 的吸引人的功能之一是它允许您扩展消息定义 而不会破坏使用旧定义的代码 对于枚举的情况根据文档 https developers google com protocol buffers docs proto
  • Windows 中的网络文件传输

    我想使用 C 或 C 通过网络传输文件 我应该查找哪些主题 我怎样才能做到这一点 您应该从选择协议开始 HTTPS http en wikipedia org wiki HTTPS and SFTP http en wikipedia or
  • Java ArrayList / String / 原子变量读取线程安全吗?

    我一直在思考和阅读 但可以找到绝对权威的答案 我有几个由包含 ArrayList 字符串和原始值的对象组成的深层数据结构 我可以保证这些结构中的数据不会改变 没有线程会对列表进行结构更改 更改引用 更改原语 我想知道读取这些结构中的数据是否
  • IOError:设备上没有剩余空间 - 哪个设备?

    我正在将一个小文件 8 5 Mb 上传到 Flask 测试服务器 文件上传完成后 服务器报告 File home ubuntu virtualenvs eco app lib python2 7 site packages wtforms
  • Angular2 rxjs http.request.catch 对于某些 http 错误有奇怪的行为

    我的 http 服务无法正确捕获一些 http 错误 catch 方法有 2 个不同的响应对象 见下文 private fireRequest request Request Observable
  • Shmem vs tmpfs vs mmap [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ASP.NET MVC 脚本包未呈现

    我已将以下行包含在BundleConfig cs file bundles Add new ScriptBundle bundles jqueryajax Include Scripts jquery unobtrusive ajax mi
  • Firestore如何从另一个集合文档id引用中获取集合值

    I have two fire store collection with following reference image I want to get the firstName and title Here signup id is
  • C 中使用 enum 和 int 变量的区别

    有什么区别 enum week Mon Tue Wed Thur Fri Sat Sun enum week day Wed and enum week Mon Tue Wed Thur Fri Sat Sun int day Wed in
  • for 循环中的 Swift async/await

    我对 WWDC 2021 上宣布的 Swift 5 5 中新的异步 等待模式感到摸不着头脑 似乎涉及到很多学习内容 但并不像想象的那么容易掌握 我刚刚在 WWDC 视频中看到了这个 for 循环 for await id in static
  • 列出所有没有远程的本地分支

    问题 我想要一种删除所有没有远程的本地分支的方法 将分支名称通过管道传输到git branch D branch name 但是我首先如何获得该列表呢 例如 我创建一个没有遥控器的新分支 git co b no upstream 我列出了所
  • 权限拒绝:从 pid=-1 访问服务 ComponentInfo {...}

    我正在尝试使用 Google 的活动识别服务 几天前 一切都很顺利 即我可以使用该服务连接来获取活动信息 但今天我发现我再也收不到了 查看日志后发现这个错误 05 15 21 19 27 196 W ActivityManager 765
  • 使用内存映射文件的缺点

    我的网络服务每分钟写入数千笔交易 我们将它们保存在硬盘上 我正在测试保存这些文件的不同方法 并使用标准 IO 和 MemoryMapped 文件进行了一些测试 在我的结果中 使用 MemoryMapped 文件写入文件 20 k 文本文件