Aku*_*ete 12 c++ memory-management
我有一个程序,我希望能够在磁盘上存储某些数据(动态分配的块),以减少内存使用和持久性.
我的第一个想法是编写我自己的自定义分配器来管理磁盘上的文件内容,但我想看看有什么替代品.
我已经研究了自定义内存分配器和关于对象序列化的主题,但在将这些原则用于管理文件的地址空间时,存在细微差别,包括好的和坏的.
在这种情况下:
仅通过IO(读/写)功能而不是直接访问存储器
没有存储对象(方法/指针),只存储数据.
文件的大小不是静态的,因此它应该在需要时增长,而不是大而静态
对于我的用途,可以在碎片整理后重新映射现有指针
由于数据不是固定大小,因此大多数数据库实现似乎都不太适合.
我问,这个问题的最佳方法是什么?我应该实现一个简单的内存分配器,将文件视为堆吗?
作为参考,我在嵌入式设备上使用C++.
编辑:我已经实现了自己的内存管理器,它使用伙伴内存分配和块大小为2的权限.我很满意它是正确的,不泄漏,合并自由块,并可以做一个'停止世界'碎片整理.
问题是,正如预期的那样,存在相当多的内部和外部碎片.我不是这个领域的专家,虽然我发现它很迷人(我还是学生),但我想知道是否还有其他任何实现相同或类似的东西?当然我不能是唯一的一个?
一些有用但迄今为止不兼容的主题是:
mmap tbh我没有使用过mmap但是,它解决了文件IO,但没有解决文件地址空间的管理问题.
BOOST:序列化我现在有一种(可能是不合理的)不愿意使用boost库.
STXXL有趣但不解决可变大小的内存分配问题
Doug Lea Memory Allocator对内存分配器的问题有很好的见解,但是我无法尝试自己实现
我已经实现了自己的内存管理器,它使用伙伴内存分配和块大小为2的权限.我很满意它是正确的并且没有泄漏,合并自由块并且可以做'停止世界'碎片整理.
这是一个伟大的第一步.一旦你有一个工作的自定义内存分配器,你当然可以做得更好!
问题是,正如预期的那样,存在相当多的内部(2个块的功率)和外部碎片.我不是这个领域的专家,虽然我发现它很有吸引力(我仍然是学生),但我想知道是否还有其他任何实现相同或类似的东西?当然我不能是唯一的一个?
二的力量是一种通用的方法.但请注意,这可能不是最好的,因为您的分配模式可能不遵循相同的几何级数.在这种情况下,最好尽可能多地进行测试,看看哪些块大小分配最多,并相应地进行优化.
我还想提一下Andrei Alexandrescu和Emery Berger关于内存分配主题的精彩文章:基于策略的内存分配以及后者的工作:Hoard Memory Allocator.
如果可能,请查看该文章末尾提到的参考文献.他们也可以提供额外的见解.
您的两个目标是减少内存使用并保留数据.这听起来像是数据库的工作.但是你说
由于数据不是固定大小,因此大多数数据库实现似乎都不太适合.
我想你会对SQLite的这个独特功能感兴趣(一个非常轻量级的跨平台数据库,带有公共域源代码):
可变长度记录
...
相反,SQLite仅使用实际存储信息所需的磁盘空间量.如果在VARCHAR(100)列中存储单个字符,则仅消耗单个字节的磁盘空间.(实际上是两个字节 - 每列开头都有一些开销来记录它的数据类型和长度.)
嵌入式设备和应用程序
由于SQLite数据库几乎不需要管理,因此对于必须在无人值守且无人工支持的情况下工作的设备或服务,SQLite是一个不错的选择.SQLite非常适合用于手机,PDA,机顶盒和/或设备.它也适用于可下载的消费者应用程序中的嵌入式数据库.