我有一个大小为2KB的类(表示树中的一个节点),当我的程序运行时,它会分配大约60,000个节点,占用120 MB的内存。
我想减少应用程序的内存占用量。为此,我试图找到一种方法,以便内存不是在堆中分配,而是以某种方式分配在虚拟内存中。
我已经查看了mmap文件。但是,我有以下疑问:
所以,我关心的是如何在有或没有内存映射文件的情况下在虚拟内存中分配我的类的新实例。
P.S。:该应用程序将在iOS上运行。
答案 0 :(得分:0)
我不是iOS程序员,但我会写一个独立于平台的回复,希望这会有所帮助。
第一点: 2KB * 60,000个节点= 120 MB
如果您使用标准分配器 - 则不然。结果大小可以更大。这是因为标准分配器需要保留许多内部信息以涵盖其使用的所有选项。
如果您使用自己的分配器 - 它可以是真的,也可以不是。这取决于如何实现自己的分配器。例如,如果使用某种线性分配器并且不在一次操作中分配对象,则可以获得一些内存开销(当然它将小于标准分配器)
如果您使用直接api调用(mmap)通过一次操作分配所有数据 - 在这种情况下,您将使用本机120 MB。
第二点:保留(或不保留)外部数据库中的某些数据
正如文章所指出的,它可以帮助减少应用程序的虚拟内存。
您甚至不需要将所有内容存储在数据库中。你可以实现类似交换机制的东西,并且只保留你目前所需的内容。
但要小心。一切都有它的价格。如果您经常在数据库中读/写数据,这可能导致cpu /电池利用率。
第三点:一些“技巧”
如果树的两个节点(或更多)可以保存相同的信息,则可以 在许多地方分配一个节点并引用他
如果在节点中某个大字节序列可以为零(或其他一些值),则可以使用类型化的chucnks实现特殊的数据结构。在这种情况下,一种类型的组块可以是小对象,其被视为零字节序列。
第四点堆/虚拟内存,mmap,内存映射文件
根据我的经验,所有需要大量内存使用的任务,总是通过虚拟内存api(mmap,VirtualAlloc)进行手动管理。如果您不需要共享数据,请不要使用内存映射文件。
PS
我写了一些关于你问题的一般信息,因为你没有指定你的任务。如果您提供更多信息,可能有更适合您的解决方案