【发布时间】:2011-12-31 10:56:41
【问题描述】:
是否可以像这样包装内存映射文件?
TVirtualMemoryManager = class
public
function AllocMem (Size : Integer) : Pointer;
procedure FreeMem (Ptr : Pointer);
end;
由于内存映射文件 API 函数都采用偏移量,我不知道如何管理内存映射文件中的空闲区域。我唯一的想法是实现某种基本的内存管理(维护不同块大小的空闲列表),但我不知道这会有多有效。
编辑:我真正想要的是(正如大卫向我明确表示的那样):
IVirtualMemory = interface
function ReadMem (Addr : Int64) : TBytes;
function AllocateMem (Data : TBytes) : Int64;
procedure FreeMem (Addr : Int64);
end;
我需要在虚拟内存中存储连续的字节块(每个相对较小),并能够使用 64 位地址将它们读回内存。大多数时候访问是只读的。如果需要写入,我会使用FreeMem,后跟AllocMem,因为大小会有所不同。
我想要一个带有这个接口的内存映射文件的包装器。在内部,它有一个内存映射文件的句柄,并在每个ReadMem 请求上使用MapViewOfFile。 Addr 64 位整数只是内存映射文件的偏移量。悬而未决的问题是如何分配这些地址 - 我目前保留一份我维护的空闲块列表。
【问题讨论】:
-
“虚拟内存”是什么意思?系统已经为您做到了。
-
我想绕过 2/3/4 GB 内存限制,并希望虚拟内存由文件(本例中为页面文件)支持。
-
在这种情况下,您需要与此不同的界面。您需要一个能够让您超过地址空间限制的接口,而这不会。
-
那你能提出一个接口吗?我知道你在工作中会做一些数据密集型的工作,所以也许你有这方面的经验?
-
@Smasher 如果 FreeMems 很少,那么忽略它们并将内存视为无限!这将它从一项艰巨的工作变成了一项微不足道的工作。
标签: windows delphi delphi-xe memory-mapped-files virtual-memory