好的C数组类用于以快速和内存有效的方式处理大型数据数组?

previous question relating to heap usage restrictions之后,我正在寻找一个良好的标准C类,以一种既节省内存又提高速度的方式处理大数据阵列.我一直在使用单个malloc / HealAlloc分配数组,但是在使用各种调用的多个trys之后,继续犯下堆碎片.因此,除了移植到64位之外,我得出的结论是使用一种机制,允许我拥有一个跨越多个较小内存片段的大型数组.我不希望每个元素都有一个alloc,因为它的内存效率非常低,因此计划编写一个覆盖[]运算符的类,并根据索引选择一个合适的元素.是否已经有一个体面的班级来做这件事,或者我最好自己滚动?

根据我的理解,以及一些googling,一个32位的Windows进程理论上应该可以解决高达2GB的问题.现在假设我已经安装了2GB,并且各种其他进程和服务占用了大约400MB,你认为我的程序可以合理地期望从堆中获得多少可用内存?

我目前正在使用各种风格的Visual C.

编辑根据Poita的帖子,我尝试了一个std :: deque,在VS2008上使用以下测试;

#include <deque>
using namespace std;
struct V    
{
    double  data[11];
};

struct T
{
    long    data[8];    
};


void    dequeTest()
{
    deque<V> VQ;
    deque<T> TQ;

    V defV;
    T defT;

    VQ.resize(4000000,defV);
    TQ.resize(8000000,defT);
}

上述数据的总内存为608MB,如果我使用直接malloc或HeapAlloc,则需要< 1秒. deque resizes最初占用了950MB,然后慢慢开始退回. 15分钟后,dequeTest()完成了,只使用6MB内存显示该进程,这可能与运行时间有关.我也尝试使用各种推送选项填充双端队列,但性能非常糟糕,我不得不提前爆发.我可以提供一个比defualt更好的分配器来获得更好的响应,但从表面来看,deque并不是这项工作的类.请注意,这也可能与deque的MS VS2008实现有关,因为在这个类中似乎有很多在性能方面非常依赖于实现. 我想,是时候写我自己的大数组了. 第二次编辑:使用以下内容立即分配较小的数量,产生1.875GB;

#define TenMB 1024*1024*10

void    SmallerAllocs()
{

    size_t Total = 0;
    LPVOID  p[200];
    for (int i = 0; i < 200; i++)
    {
        p[i] = malloc(TenMB);
        if (p[i])
            Total += TenMB; else
            break;
    }
    CString Msg;
    Msg.Format("Allocated %0.3lfGB",Total/(1024.0*1024.0*1024.0));
    AfxMessageBox(Msg,MB_OK);
}

最后的编辑我已经决定接受Poita的帖子和它后面的各种评论,不是因为我将直接使用deque类,而是更多的数组作为随后的评论中的一副牌概念.这应该是直接用O(1)随机元素访问实现的,基于每个块的固定数量的元素,这是我需要的.感谢大家的反馈!

最佳答案
你尝试过使用std :: deque吗?与使用一个巨大的堆分配的std :: vector不同,deque通常以小块分配,但仍然通过operator []提供分摊的常量时间索引.

转载注明原文:好的C数组类用于以快速和内存有效的方式处理大型数据数组? - 代码日志