我是电气工程的学生。
作为一种评估,我需要实现在医学成像中使用的背部投影算法以形成图像。要计算最终图像,很多信息将计算并保存在向量中。在最终图像的某些所需分辨率(256*256像素)中,程序崩溃了,我决定将此信息写入90个文本文件。
我使用stream编写这些文件。
计算此信息然后将其存储在向量中所需的时间为:
- 输出分辨率64x64:13,4S
- 输出分辨率128x128:140s
在.txt文件中编写此信息:
- 64x64 156s(1,25 MB/file)
- 128x128 1400(5MB/file)
代码写入文件:
ofstream file;
for(k = 0; k < 90; k++)
{
oss.str(""); //string stream
oss << "rec\reconstruction_matrix_step"<< k << ".txt" ; // per step other file
filename = path;
filename.append(oss.str());
file.open(filename.c_str());
double weight;
for( l = 0; l < resolution; l ++)
{
bestand << "Begin " << l << endl;
l_border = - WIDTH*(resolution*1.0/2.0 - l);
r_border = - WIDTH*(resolution*1.0/2.0 - l) + WIDTH;
for(i = 0; i < resolution; i++)
{
for(j = 0; j < resolution; j++)
{
file << getSurface(pixels[i][j], l_border, r_border) << "t";
}
file << "n";
}
file << "End" << l << "nnn";
}
file.close();
}
当我使用矢量时,getSurface(pixels [i] [j],l_border,r_border)放在矢量中而不是被写入文件中。
有什么办法可以加快此过程?
尝试将格式从文本更改为二进制;这可能会大大减少文件大小(和文件编写时间)。
file.open(filename.c_str(), ios_base::binary);
...
// The following writes a vector into a file in binary format
vector<double> v;
const char* pointer = reinterpret_cast<const char*>(&v[0]);
size_t bytes = v.size() * sizeof(v[0]);
file.write(pointer, bytes);
如果 bestand
是复制剩余的,并且与 file
相同,则我将用 'n'
替换 endl
。 std::endl
冲洗您的输出流并破坏iostream缓冲所获得的任何吞吐量。
如果这不是您的问题,我建议您分析您的程序。通过分析,您可以用数字替换猜测,您可以在其上进行进一步的行动。