Я пытаюсь написать большую матрицу float в формате OpenCV Mat для двоичного файла. Я на виртуальной коробке с Linux x64.Написать большой макет OpenCv
И у меня раздавлен счетчик 536000000, так что кажется, что у меня переполнение int вокруг «подозрительной строки» в p + i * 4? (кстати, assert не обнаруживает этот случай, почему?).
Так что, когда я меняю «int i» на «int64 i», все выглядит нормально, но я не уверен, можно ли добавить больше 2^32 в указатель char *?
Кроме того, каков максимальный размер матрицы OpenCV?
bool WriteFloatMat(string path, const Mat &img)
{
ofstream fs(path, ios::binary);
fs.write((char*)&(img.cols), 4);
fs.write((char*)&(img.rows), 4);
int64 sz_ = img.cols*img.rows;//
assert(sz_ < numeric_limits<int>::max());//
int sz = img.cols*img.rows;
cout << sz << endl;
int64 counter=0;
int64 maxVal= numeric_limits<int>::max();
char* p= image.ptr<char>();
for(int i=0; i<sz; ++i)
{
assert(i*4 < numeric_limits<int>::max());//suspicious line
fs.write(p+i*4, 4);
++counter;
if(counter%1000000==0)
cout << counter << endl;
if(counter>maxVal)
cout << "Out of limits!" << endl;
}
return true;
}
void TestIO()
{
//max matrix dimensions?
int rows= 1000*1000*10;
int cols= 100;
Mat mat(rows,cols,CV_32FC1);
mat=mat+7;
double t = (double)getTickCount();
WriteFloatMat("/media/dummy.big", mat);
t = ((double)getTickCount() - t)/getTickFrequency();
cout << "Times passed in seconds: " << t << endl;
}
Update: Я понимаю, почему assert(i*4 < numeric_limits<int>::max());
не работает, потому что я * 4 переполнения и <-так assert(i*4 >=0);
работы.
Почему вы пишете одно значение в то время? не можете ли вы сразу написать всю матрицу данных? Посмотрите [здесь] (http://stackoverflow.com/a/31584182/5008845) для примера – Miki
@Miki Есть ли ограничения 'ofs.write', потому что я хочу писать большие файлы> 4Gb? – mrgloom
Вы должны быть в порядке с файлом> 4Gb. – Miki