首页 > 系统相关 >c#使用内存映射像处理内存一样去快速处理文件

c#使用内存映射像处理内存一样去快速处理文件

时间:2023-05-31 20:22:51浏览次数:36  
标签:文件 映射 Point c# 处理 int 内存 using

在 .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# 中的不安全代码规范。

标签:文件,映射,Point,c#,处理,int,内存,using
From: https://www.cnblogs.com/tansm/p/MMFToArray.html

相关文章

  • m基于FPGA的RGB转ycrcb颜色空间转换算法实现,包含testbench,对比三种转换方法
    1.算法仿真效果vivado2019.2仿真结果如下: 其中1为直接乘法公式计算; 2为移位法计算; 3为分布式计算; 2.算法涉及理论知识概要        人类获得信息的主要方式是视觉,通常情况下颜色有2种描述方式,一种是RGB色度空间表示,一种是YCbCr色度空间表示。然而,普通......
  • AT_abc274_d 总结
    题目:AT_abc274_d链接:洛谷,AT,逐月题意给定正整数数组\(a\)和整数\(x,y\),请判断是否有\(n+1\)个点满足(一个坐标可以不止一个点):\(p_1=(0,0),p_2=(A_1,0),p_{n+1}=(x,y)\)。\(p_i\)与\(p_{i+1}(2\lei\len)\)的距离为\(a_{i}\)线段\(p_ip_{i+1......
  • [Docker] Container communcation
    ForexampleyouhavetwocontainersrunningContainerA:needtotalktoContainerBContainerB,runninganodeapplicationexportport1337 FromcontainerAdockercomposeexec-itcontainerAbashYoucanpingcontainerBnc-vcontainerB1337Tochec......
  • VulnHub-Gemini Inc: 1
    靶机地址:https://www.vulnhub.com/entry/gemini-inc-1,227/目标:Identifyanyvulnerabilitiespossiblewiththegoalofcompletesystemcompromisewithrootprivilege.Todemonstratethelevelofaccessobtained,pleaseprovidethecontentofflag.txtlocatedint......
  • docker安装
    1.官方按照链接:https://docs.docker.com/engine/install/centos/    2.配置镜像加速器登录阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors?accounttraceid=e1892dba7dce4d22a171aa260e87de01ueuh  ......
  • Autowired注解与Resource注解的区别
    两者的用法其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用.两者的共同点@Resource注解和@Autowired注解都可以用作bean的注入.在接口只有一个实现类的时候,两个注解可以互相替换,效果相同不同点:1、@Resource注解是Java自身的注解......
  • Miniconda+Pycharm中虚拟环境配置
    在安装完Miniconda后,win+r打开命令提示符,输入cmd在命令提示符输入conda,出现以下则安装成功;如果输入conda出现“不是内部或外部命令,也不是可运行的程序或批处理文件”,这样的提示说明要手动配置系统环境变量。操作:找到Miniconda的安装路径,找到Scripts,复制文件路径添加到系统path......
  • 比较 VisualVM、JMC 和异步分析器
    关键要点分析程序的性能很重要:您是否了解用于分析的开源工具有两种主要类型的分析器:采样分析器和检测分析器;了解它们的差异将帮助您选择合适的类型三种主要的开源分析器各有优缺点:一个简单的分析器(VisualVM),一个具有很多特性的可分析器(async-profiler),以及一个获取大量附加信息......
  • 揭开 JavaScript 事件循环的神秘面纱
    Javascript是一种单线程语言,这意味着它一次只能执行一个任务。但是,它仍然设法同时执行多项任务。它通过使用一些复杂的数据结构给人一种多线程的错觉。为实现这一点,Javascript引擎有一个称为事件循环的重要组件。我们将了解什么是事件循环以及它如何在不阻塞主线程的情况下处理异......
  • CentOS7配FTPS
    CentOS7配FTPS:yuminstallvsftpdvi/etc/vsftpd/vsftpd.confssl_enable=YESallow_anon_ssl=NO#force_local_data_ssl=YES#force_local_logins_ssl=YESrsa_cert_file=/etc/vsftpd/ssl/aa.crtrsa_private_key_file=/etc/vsftpd/ssl/aa.key#ssl_sslv2=YES#ssl_sslv3=YESp......