我目前在使用数据声明或填充大型数组时遇到问题,因为我得到一个"内存不足"的对话框,源自CMemoryException.
我试图用一个对象的大约50000个元素创建一个数组或向量(试过两个),其中sizeof(MyObjectClass)返回大约37000个字节.
如果我尝试按元素填充向量或CArray元素,那么在获取Out Of Memory异常之前,我会在16000个元素附近填充.那应该接近600MB?
我在机器上有8GB RAM,根据Windows任务管理器只使用4GB.因此物理RAM的数量不应该带来问题.我在Visual Studio 2010中运行C++ MFC,32位.
如果我试着写
MyObjectClass* heaparray = new MyObjectClass[50000];
Run Code Online (Sandbox Code Playgroud)
然后我立即在那一行上得到了同样的内存不足错误.
有任何想法吗?先感谢您!
更新:我还尝试使用以下字段创建一个TestStruct:
struct TestStruct
{
long long field1;
GUID field2;
GUID field3;
GUID field4;
TCHAR field5[256];
TCHAR field6[4];
TCHAR field7[258];
TCHAR field8[1026];
TCHAR field9[258];
TCHAR field10[16386];
TCHAR field11[258];
};
TestStruct* heapArr = new TestStruct[50000];
Run Code Online (Sandbox Code Playgroud)
仍然相同...执行最后一行代码时出现"Out of Memory"异常.在处理大数据时,堆不应该只是由RAM(或多或少)限制的可能性之一.然而......因为它已经在600MB的分配空间崩溃了,我不能同意这是非常大的数据......或者我应该?:/
这是一个有趣的.两个矢量和阵列连续存储在内存中陈述这里.
你不仅在内存中寻找1850000000 bytes
(1.72295 gigabytes
),而且还有一大块不间断的内存.这很难找到.如果切换到不执行连续存储的不同数据结构(比如链接列表),那么您可以存储那么多.
注意:这也会使每个对象变得更大.
什么是最好的是看是否有任何方法来缓冲对象; 只加载你要更新的那些,并在需要时动态加载其他的.我怀疑你一次只能在多个CPU上进行cpu操作.如果你做得对(最有可能穿线)你甚至不会因读/写它们而受到任何影响.
有关您正在进行的工作的更多信息将会有所帮助.如果对象的变量小于2,147,483,647(int的大小),甚至可能有一种方法可以让数组填充类型标识符.你可以存储一个可以从中生成类的整数数组(toHash和fromHash,这将是50000*4字节= 195.312千字节),这也可能对你有用.同样,这取决于你正在做什么.
归档时间: |
|
查看次数: |
4681 次 |
最近记录: |