微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用内存映射文件实现虚拟内存

是否有可能包装内存映射文件是这样的?

TVirtualMemoryManager = class public function Allocmem (Size : Integer) : Pointer; procedure FreeMem (Ptr : Pointer); end;

由于内存映射文件的API函数都取得了偏移量,我不知道如何pipe理内存映射文件中的空闲区域。 我唯一的想法是实现一些基本的内存pipe理(不同的块大小的免费列表),但我不知道这将是多么有效。

编辑 :我真正想要的(正如大卫向我明白的)是这样的:

IVirtualMemory = interface function ReadMem (Addr : Int64) : TBytes; function AllocateMem (Data : TBytes) : Int64; procedure FreeMem (Addr : Int64); end;

我需要将连续的字节块(每个字节相对较小)存储在虚拟内存中,并能够使用64位地址将它们读回到内存中。 大部分时间访问是只读的。 如果需要写入,我将只使用FreeMem然后使用Allocmem因为大小将会不同。

如何获取文件下一页/部分/视图,如果我使用MapViewOfFile读取文件的一部分?

msync()写入文件只改变了页面或整个caching的缓冲区?

在Windows中为内存映射文件命名约定

用于读取input文件的内存映射文件有多安全?

将DMA缓冲区写入内存映射文件

我想要这个接口的内存映射文件的包装。 在内部它有一个内存映射文件的句柄,并在每个ReadMem请求上使用MapViewOfFile 。 Addr 64位整数只是内存映射文件的偏移量。 现在的问题是如何分配这些地址 – 我现在保留一个我保留的空闲块列表。

为什么remap_file_pages()在这个例子中失败?

为什么这个循环会毁掉我的记忆?

部分对象(CreateFileMapping)的I / O比基本apis(Read / WriteFile)快吗?

用C#直接从内存中处理内存映射文件

C ++ MapViewOfFile失败

你的建议,“ 内部它有一个内存映射文件的处理和使用每个ReadMem请求MapViewOfFile ”将只是一个浪费cpu资源,恕我直言。

值得一提的是,您的GetMem / FreeMem要求将无法打破3/4 GB的屏障。 由于所有分配的内存都将映射到内存中,直到调用FreeMem ,所以与常规的Delphi内存管理器一样,内存空间不足。 最好的办法是依靠FastMM4 ,并改变你的程序来减少内存的使用。

恕我直言,你将不得不改变/更新你的规范。 例如,你的“更新”的问题听起来就像一个常规的存储问题。

你想要的是能够为你的应用程序分配超过3/4 GB的数据。 在我们的SynBigTable开放源代码单元中,您可以实现这样的功能。 这是纯Delphi中的一个快速而简单的Nosql解决方案。

它可以创建任意大小的文件(只有64位有限),然后根据请求将每个记录的内容映射到内存中。 如果可能,它将使用文件的内存映射。 你可以用TSynBigTable方法直接实现你的接口: ReadMem=Get,Allocmem=Add,FreeMem=Delete 。 这些ID将是您的RawByteString pointer的值,将使用RawByteString而不是RawByteString 。

您可以使用整数ID或字符串ID访问任何数据块,甚至可以使用复杂的字段布局(在记录内或作为内存中的元数据(包括索引和快速搜索))。

或者依靠常规的嵌入式sql数据库。 例如, sqlite3在处理BLOB字段方面非常出色,并且能够存储大量的数据。 对于大多数使用过的记录,使用简单的内存缓存机制,可能是一个强大的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐