惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
J
Java Code Geeks
A
About on SuperTechFans
F
Fortinet All Blogs
B
Blog
aimingoo的专栏
aimingoo的专栏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
博客园_首页
博客园 - 叶小钗
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
云风的 BLOG
云风的 BLOG

博客园 - 编写人生

关于数据隔离 Pool 模型 的补充 数据流动、隔离粒度与一致性 大型 ERP 云架构的隔离与协作 企业级 Agent 架构的真实形态:Skill、A2A 与 MCP 的边界思考 如何更优雅地提供 MCP Resources 面向 AI Agent 的能力模型与多协议生成架构设计思考 从 LangGraph 回到 Model-Tool Loop:更聪明的模型,正在让 Agent 架构重新变简单 Agent 的“上下文” 生命周期的思考 .NET GC设计的新想法 AI OS 海量 MCP 工具场景下的上下文隔离选择方案 Python 异步编程完全指南 软件架构设计模式全览 我花了一上午,帮一个 AI 找到了自己的"亲生父母" Agent构建:声明式优于硬编码 探索 Nim 中的 sequtils 与箭头语法 —— 立即计算与惰性计算的那些事 .NET Exception.Data 属性:上下文错误处理的架构深思 组合优于继承最佳实践指南 UI界面设计:继承 vs 组合 的架构思考 Nim 枚举类型 对性能的影响 Nim 概念 Concept 对性能的影响 C# 泛型编译特性对性能的影响 在AI大爆发的背景下,企业管理软件有什么冲击 关于.net 和 JAVA 在内存处理(GC)设计上的差距(ChatGPT水文) 我与 ChatGPT 讨论了面向对象语言 中,关于动态调用的问题 寓言故事:超喜欢的玩具 关于 智能红绿灯 的简单探索 Nim 语言新的性能测试 Kotlin 实现类似 C# 的 Event 事件代码
c#使用内存映射像处理内存一样去快速处理文件
编写人生 · 2023-05-31 · via 博客园 - 编写人生

在 .NET Core 中,`System.IO.MemoryMappedFiles.MemoryMappedFile` 类提供了对内存映射文件的支持。通过将文件映射到内存,你可以在应用程序中直接访问文件的内容,而不需要显式地进行文件的读取和写入操作。

内存映射文件允许你将文件的特定区域映射到内存中的一个或多个 `MemoryMappedViewAccessor` 对象。`MemoryMappedViewAccessor` 提供了对映射区域的读写访问。

同时,你可以使用 `MemoryMappedViewAccessor.SafeMemoryMappedViewHandle` 进行不安全操作,并将其映射到一个 数组,例如int[] 或者你自定义的Point[]。

通过这种方式,你可以直接访问内存映射的数据,并对其进行更改,这将自动反映在映射文件中。

在下面的示例中,展示了如何使用 `MemoryMappedViewAccessor.SafeMemoryMappedViewHandle` 将内存映射文件映射到 `Point[]` 数组:

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;

class Program
{
    struct Point
    {
        private int x;
        private int y;

        public Point(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public int X => x;
        public int Y => y;
    }


    static void Main()
    {
        int arrayLength = 10;
        int arraySize;

        unsafe
        {    
            arraySize = sizeof(Point) * arrayLength;
        }

        using (var mmf = MemoryMappedFile.CreateFromFile("data.bin", FileMode.OpenOrCreate, "myData", arraySize))
        {
            using (var accessor = mmf.CreateViewAccessor())
            {
                unsafe
                {
                    byte* ptr = null;

                    try
                    {
                        accessor.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);

                        // 将内存映射的指针转换为 Point 数组
                        Point* pointArrayPtr = (Point*)ptr;

                        // 在 Point 数组中进行读写操作
                        for (int i = 0; i < arrayLength; i++)
                        {
                            pointArrayPtr[i] = new Point(i,i);
                        }

                        // 从 Point 数组中读取数据
                        for (int i = 0; i < arrayLength; i++)
                        {
                            Point value = pointArrayPtr[i];
                            Console.WriteLine($"x={value.X}, y={value.Y}");
                        }
                    }
                    finally
                    {
                        if (ptr != null)
                        {
                            accessor.SafeMemoryMappedViewHandle.ReleasePointer();
                        }
                    }
                }
            }
        }
    }
}

在这个示例中,首先创建一个内存映射文件,并指定了与 `Point[]` 数组相同大小的映射区域。然后,我们使用 `CreateViewAccessor` 方法创建一个 `MemoryMappedViewAccessor` 对象。

在 `unsafe` 上下文中,我们通过调用 `SafeMemoryMappedViewHandle.AcquirePointer` 方法来获取内存映射的指针,然后将指针转换为 `Point*` 类型,从而将其视为 `Point[]` 数组。

通过直接使用指针进行读写操作,你可以直接修改内存映射的数据,这将自动反映在映射文件中。最后,使用 `SafeMemoryMappedViewHandle.ReleasePointer` 方法释放指针。

但是,使用不安全代码需要谨慎,并且需要遵循安全性和正确性的最佳实践。确保你正确管理内存和指针,并遵循 C# 中的不安全代码规范。