gpt4 book ai didi

c# - 内存映射文件和内存消耗

转载 作者:太空狗 更新时间:2023-10-30 01:05:38 24 4
gpt4 key购买 nike

给定以下测试代码(x64 环境):

    static void Test()
{
string fileName = @"d:\map";
long length = new FileInfo(fileName).Length;
using (var file = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "mapFile", length, MemoryMappedFileAccess.ReadWrite))
{
byte* bytePtr = (byte*)0;
var view = file.CreateViewAccessor(0, length, MemoryMappedFileAccess.ReadWrite);
view.SafeMemoryMappedViewHandle.AcquirePointer(ref bytePtr);

long count = (long)(length / sizeof(int));
long sum = 0;
long step = count / 2000;

int* ptr = (int*)&bytePtr[0];
long currentCount = 0 ;

Parallel.For(0, count, new ParallelOptions { MaxDegreeOfParallelism = 8 }, (i) =>
{
Interlocked.Add(ref sum, ptr[i]);
Interlocked.Increment(ref currentCount) ;

if (currentCount % step == 0)
Console.Write("\r{0:0.00}%", (100 * currentCount / (float)count));
});

Console.WriteLine(sum);

view.Dispose();
}
}

鉴于“d:\map”是一个 40GB 的文件,当通过指针“ptr”进行随机访问时会出现非常奇怪的行为。

系统物理内存被完全使用,一切都变慢,这个过程需要 2 个多小时才能完成。

当我进行顺序(和单线程)访问时,使用的物理内存不会超过 1GB,并且该过程大约需要 8 分钟。

我的问题是:当使用内存映射文件时,是否使用了“真实”内存?被占用的不仅仅是虚拟地址空间吗?

我正在尝试了解使用内存映射文件时的物理内存消耗。

最佳答案

内存映射文件使用虚拟内存。与 64 位操作系统上的 RAM 相比,您映射 VM 空间的千兆字节没有问题。点一个需求页面虚拟内存的操作系统,所有正在运行的进程所需的内存总和总是大大超过RAM的数量。

将其映射到 RAM 需要花钱,这就是需求发挥作用的地方。当处理器试图访问未映射到 RAM 的虚拟内存地址时,它会中断程序并大声呼救。称为页面错误

如果您没有花这笔钱获得至少 40 GB 的 RAM,那么您将不可避免地支付操作系统处理这些页面错误的成本。这需要分配一个 RAM 页面并用文件中的内容填充它。当它必须取消映射之前映射的 RAM 并将其内容保存到文件时,Perf go South。随后重新使用释放的 RAM 页面并从适当的文件偏移量加载文件内容。很鹿,盘很慢。一个称为“颠簸”的问题。

当你顺序寻址内存时,问题就小得多,一个页面错误对于 4096 字节的顺序访问是好的,你很有可能在你跳闸时磁盘读取头仍然在正确的位置页面错误。

关于c# - 内存映射文件和内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com