我在Borland C++Builder 6中工作,必须创建一个13230 x 26460的double值数组。
该矩阵大小具有350065800元素,并且它占用内存的350065800 * 8 bytes = 2800526400 bytes = 2.6GB。
我使用的是64位Windows和8 8GB内存。
即使我在图像标志选项(GF)中设置了LARGEADDRESSAWARE标志,它也不能声明数组。
在Borland C++Builder中有没有其他方法来声明一个2.6GB大小的数组?
发布于 2017-03-16 14:37:26
您不能将8 GByte作为BCB6中的单个阵列!出现这种情况的原因很少:
因此您操作系统或仿真器不能处理超过2或4 GB的内存。这意味着无论你做什么,8 8GB都是毫无疑问的。是的,即使你有x64操作系统,你的32位应用程序也是在WoW64模拟器中运行的……
new 无法分配超过1 GB的单个区块不知道为什么,因为限制应该接近2 GB或4 GB,但至少对我来说,略高于的1 GB(即使有超过2 GB的空闲WoW64)是安全分配的最大限制。可能从旧版本继承了Borland内存管理器的限制。此行为是在BDS2006上测试的,因此不确定BCB6是否相同,但我认为没有理由不同,因为它们共享相同的内存管理器和相关的C++引擎错误(在BCB5 btw中不存在)。
最后,当您使用new,delete[]时,您应该检查以下内容(只是为了确保):
所以你需要把你的数组分成更多的块。因为你得到了2D矩阵,所以你可以使用,Malcolm,McLean,建议的数组。因此,如果您的数组的单元格是T,请尝试:
#define T double
T **m=new T*[13230];
for (int i=0;i<13230;i++) m[i]=new T[26460];
m[10000][20000]=1.2345; // do your stuff with m[][]
for (int i=0;i<13230;i++) delete[] m[i];
delete[] m;只需更改数据类型的T (我使用的是double,因为它也是8字节),并添加对返回NULL的new的检查
如果你真的需要8 8GB的矩阵,你需要将它存储在文件中。或者使用64位编译器,如RAD2009或更高版本。
发布于 2017-04-05 01:54:38
正如雷米所说,C++ Builder6只能创建32位应用程序,该应用程序最多可以消耗2 2GB (如果您使用了32位操作系统,则为3 2GB)内存。另外,通常情况下消耗8 8GB内存也不被认为是良好的编程实践。
话虽如此,如果你真的必须这么做,你可以使用CreateFileMapping和MapViewOfFile创建一个现金内存。这样,您的数据存在于磁盘上,但您可以像访问内存中的数据一样访问它。缺点是,它将是缓慢的。
HANDLE hFile = ::CreateFile(fileName, ...);
HANDLE hFM = ::CreateFileMapping(hFile, ...);
double**m= (double**)::MapViewOfFile(hFM, ...);
m[10000][20000]=1.2345; // do your stuff with m[][]
::UnmapViewOfFile((void*)m);
::CloseHandle(hFM);
::CloseHandle(hFile);不要忘记使用UnmapViewOfFile和CloseHandle进行清理。如果你不这样做,你可能会弄乱windows的现金内存。
https://stackoverflow.com/questions/42823855
复制相似问题