Я застрял в неприятной проблеме оптимизации в моем программном обеспечении для анализа КТ. Я использую ITK для выполнения тяжелой фильтрации данных и, наконец, с помощью itk binaryImageToshapeLabelMapFilter я изолирую некоторые отдельные регионы и сохраняю координаты каждой точки, принадлежащей им, в текстовый файл (который затем будет вводом другого отдельного программа уже сделана)
Проблема в том, что фаза записи в файл занимает, в случае очень больших регионов, гораздо больше времени, чем сама фильтрация (мне довелось отфильтровать некоторые наборы данных за 30 минут, а запись в файл заняла еще час).
В следующем коде я уже пытался избежать сбрасывания в конце каждой строки ("\n" вместо endl), но, похоже, ничего не изменилось. Есть ли у вас какие-либо идеи о том, как я могу значительно улучшить запись в файл этих данных?
С уважением, Эмилиано
ofstream outFile;
string labelsFile = subFolderPath+"/regionLabels_"+volumeCompleteName+".lri";
outFile.open(labelsFile.c_str());
outFile << "LabelIndexes - v1.0" << "\n";
outFile << "Dataset Origin : "<< originX << "," << originY << "," << originZ << "\n";
int cloud = 0;
for(unsigned int i = 0; i < binaryImageToShapeLabelMapFilter->GetOutput()->GetNumberOfLabelObjects(); i++){
BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = binaryImageToShapeLabelMapFilter->GetOutput()->GetNthLabelObject(i);
if(labelObject->GetNumberOfPixels()>4500){
outFile << "Region " << cloud << "\n";
outFile << "Centroid " << labelObject->GetCentroid() << "\n";
outFile << labelObject->GetNumberOfPixels() << "\n";
for(int j=0;j<labelObject->Size();j++){
//Only save the labels for voxels at least 2 voxels distant from the edge of the dataset
if(labelObject->GetIndex(j)[0]>2 && labelObject->GetIndex(j)[1]>2 && labelObject->GetIndex(j)[2]>2){
if(labelObject->GetIndex(j)[0]<(maxX-2) && labelObject->GetIndex(j)[1]<(maxY-2) && labelObject->GetIndex(j)[2]<(maxZ-2)){
outFile << labelObject->GetIndex(j) << "\n";
}
}
}
cloud++;
}
}
outFile << "EndOfFile" << "\n";
outFile.flush();
outFile.close();
cout << "All labels indices saved to file : " << labelsFile << endl;
Последний дополнительный вопрос. У меня не было времени попробовать набор данных, который я уже отфильтровал с помощью старого метода, но последние 2, которые я отфильтровал с помощью нового, похоже, теряют половину каждого региона. Я неправильно использую индексы, используя их следующим образом:
FILE* fout = fopen(labelsFile.c_str(), "w");
fprintf(fout,"LabelIndexes - v1.0\n");
fprintf(fout,"Dataset Origin : %d,%d,%d\n",originX,originY,originZ);
for(unsigned int i = 0; i < binaryImageToShapeLabelMapFilter->GetOutput()->GetNumberOfLabelObjects(); i++){
BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = binaryImageToShapeLabelMapFilter->GetOutput()->GetNthLabelObject(i);
if(labelObject->GetNumberOfPixels()>4500){
fprintf(fout,"Region %d \n",cloud);
double c1 = labelObject->GetCentroid()[0];
double c2 = labelObject->GetCentroid()[0];
double c3 = labelObject->GetCentroid()[0];
fprintf(fout,"Centroid [%f, %f, %f]\n",c1,c2,c3);
fprintf(fout,"%u\n",(long)labelObject->GetNumberOfPixels());
for (int l = 0; l < labelObject->GetNumberOfLines(); ++l){
LabelObjectLine<3> line = labelObject->GetLine(l);
OutputImageType::IndexType startIndex = line.GetIndex();
int i1 = startIndex[0];
int i2 = startIndex[1];
int i3 = startIndex[2];
if(i1>2 && i2>2 && i3>2 && i1<(maxX-2) && i2<(maxY-2) && i3<(maxZ-2))fprintf(fout,"[%d, %d, %d]\n",i1,i2,i3);
}
cloud++;
}
}