我用动态数组写了一个32位程序来存储一个未知计数的三角形列表.我目前的策略是估计非常多的三角形,然后在创建所有三角形时修剪列表.在某些情况下,我只会在其他情况下分配一次内存,我需要添加到分配中.
对于一个非常大的数据集,当我的应用程序的内存使用量大约为1.2GB时,我的内存不足,而且由于分配步骤太大,我觉得我可能会破坏内存.
看看FastMM(内存管理器)我看到这些常量会建议其中一个是增量的好大小.
ChunkSize = 64 * 1024;
MaximumSmallBlockSize = 32752;
LargeBlockGranularity = 64 * 1024;
Run Code Online (Sandbox Code Playgroud)
其中一个是增加阵列大小的最佳尺寸吗?
最终这个程序将成为64位,但我们还没有为这一步做好准备.
这里真正的问题不在于你的内存不足,而是内存分配器找不到足够大的连续地址空间块.您可以做的一些简单的事情包括:
LARGEADDRESSAWAREPE标志,以便您的进程获得4GB的地址空间而不是2GB.除此之外,您可以做的最好的事情是分配较小的块,以避免将大型数据结构存储在连续内存中的要求.以块为单位分配内存.因此,如果您需要1GB内存,请分配64个大小为16MB的块.您使用的确切块大小可以根据您的需要进行调整.较大的块会带来更好的分配性能,但较小的块允许您使用更多的地址空间.
将其包装在一个容器中,该容器向消费者提供类似接口的数组,但在内部将内存存储在非连续的块中.