是否有可能像这样包装内存映射的文件?
TVirtualMemoryManager = class
public
function AllocMem (Size : Integer) : Pointer;
procedure FreeMem (Ptr : Pointer);
end;由于内存映射文件API函数都带有抵消项,所以我不知道如何管理内存映射文件中的空闲区域。我唯一的想法是实现某种基本的内存管理(维护不同块大小的空闲列表),但我不知道这会有多高的效率。
编辑:I真正想要的是什么(正如David告诉我的那样):
IVirtualMemory = interface
function ReadMem (Addr : Int64) : TBytes;
function AllocateMem (Data : TBytes) : Int64;
procedure FreeMem (Addr : Int64);
end;我需要在虚拟内存中存储连续的字节块(每个字节块相对较小),并能够使用64位增量将它们读入内存中。大多数情况下,访问是只读的。如果需要写入,我将只使用FreeMem,然后使用AllocMem,因为大小无论如何都是不同的。
我需要一个带有此接口的内存映射文件的包装器。在内部,它有一个内存映射文件的句柄,并对每个MapViewOfFile请求使用ReadMem。Addr 64位整数只是在内存映射文件中进行偏移.公开的问题是如何分配这些附件-我目前保存了一个免费的区块列表,我保持。
发布于 2011-11-17 17:03:42
GetMem / FreeMem需求将无法突破3/4 GB的限制。由于所有分配的内存都将映射到内存中,直到调用FreeMem,所以您将缺少内存空间,就像常规的Delphi内存管理器一样。您能做的最好的就是依赖FastMM4,并更改程序以减少其内存使用。您想要的是能够为应用程序分配超过3/4GB的数据。您可以在我们的SynBigTable开源单元中实现这样的特性。这是一个快速和轻的NoSQL解决方案,在纯德尔菲。
它能够创建任意大小的文件(只有64位限制),然后根据请求将每个记录的内容映射到内存中。如果可能的话,它将使用文件的内存映射。您可以非常直接地使用TSynBigTable方法:ReadMem=Get, AllocMem=Add, FreeMem=Delete实现您的接口。ID将是您的pointer-like值,并且将使用RawByteString而不是TBytes。
您可以使用整数ID或字符串ID访问任何数据块,甚至可以使用复杂的字段布局(在记录中,或作为内存中的元数据--包括索引和快速搜索)。
或者依赖于常规的嵌入式SQL数据库。例如,SQLite3非常擅长处理BLOB字段,并且能够存储大量数据。对于大多数使用的记录,使用一个简单的内存缓存机制,它可能是一个强大的解决方案。
https://stackoverflow.com/questions/8169528
复制相似问题