我曾经使用3D动态分配数组,但我读到1D数组有更好的性能,所以我尝试在一维数组中传输我的3D数组。
我使用两个大数组(大约240 * 320 * 1000双),分配如下:
int numberFiles; //about 1000, can change
int nRow; //240
int nCol; //320
double *inputData;
double *outputData;
inputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always works
outputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always fails
第二次分配总是失败。由于第一个没有,它不是尺寸问题。因为,当在3D阵列中分配它时,它也有效,它不是内存空间问题
为什么第二次分配失败的任何想法?
感谢。
陈松。PS:对不起的英语很抱歉。
PS2:尝试了新的Double [],同样的问题。
编辑:所以在一个简单的代码中分配有效,但是一旦我尝试将它放在我的应用程序中,它就不再起作用了。我使用mingw32与QtCreator进行交互,并使用matio(读取MATLAB文件的库)来读取数据。这是我的程序的代码示例,它给了我错误:
//Needed include
using namespace std;
int main(int argc, char ** argv)
{
int k,i,j;
double *matriceBrute,*matriceSortie;
double* matData;
const char * c;
mat_t *matfp;
matvar_t *matvar;
QApplication app(argc,argv);
// Getting the directory of the data and the files in it
QString directoryPath = QFileDialog::getExistingDirectory();
QDir myDir(directoryPath);
myDir.setNameFilters(QStringList()<<"*.MAT");
QStringList filesList = myDir.entryList(QDir::Files | QDir::Hidden);
string fullPath= (directoryPath+"/"+filesList[0]).toLocal8Bit().constData();
c = fullPath.c_str();
// Loading the first one to get the size of the data
matfp = Mat_Open(c,MAT_ACC_RDONLY);
matvar = Mat_VarReadNextInfo(matfp);
int read_err = Mat_VarReadDataAll(matfp,matvar);
int numberFiles = (int)filesList.size();
int nCol = matvar->dims[1];
int nRow = matvar->dims[0];
//Allocating
matriceBrute = (double*)malloc(nCol*nRow*numberFiles*sizeof(double));
matriceSortie = (double*)malloc(nCol*nRow*numberFiles*sizeof(double));
//the first one works but not the second
//loading the data in the allocated memory
for (k=0;k<numberFiles;k++)
{
fullPath= (directoryPath+"/"+filesList[k]).toLocal8Bit().constData();
c = fullPath.c_str();
matfp = Mat_Open(c,MAT_ACC_RDONLY);
matvar = Mat_VarReadNext(matfp);
matData = (double*)(matvar->data);
for (i=0;i<nRow;i++)
{
for (j=0;j<nCol;j++)
{
matriceBrute[i + nRow*(j+k*nCol)]=*(matData+(i+j*nRow));
matriceSortie[i + nRow*(j+k*nCol)]=*(matData+(i+j*nRow));
}
}
Mat_VarFree(matvar);
Mat_Close(matfp);
}
}
答案 0 :(得分:1)
没有错误,它有效。
#include <iostream>
using namespace std;
int main()
{
int numberFiles = 1000; //about 1000, can change
int nRow = 240; //240
int nCol = 240; //320
double *inputData;
double *outputData;
inputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always works
outputData = (double*)malloc(nCol*nRow*numberFiles*sizeof(double)); //Always fails
if (inputData == NULL)
cout << "inputData alloc failed" << endl;
if (outputData == NULL)
cout << "outputData alloc failed" << endl;
return 0;
}
它不会打印失败,所以,不要担心,要开心。
答案 1 :(得分:1)
可能是内存碎片问题?例如,如果你不能两次分配~0.6Gb(一个堆)?第一次你分配它,在第二次 - 它只是在你的物理内存中找不到这么大的空闲内存堆? 你收到哪个例外?