5

我是电气工程专业的学生。

作为一项任务,我需要实现医学成像中使用的反投影算法以形成图像。为了计算最终图像,需要计算大量信息并将其保存在向量中。在最终图像的某个所需分辨率(256*256 像素)下,程序在我用完 RAM 时崩溃,所以我决定将此信息写入 90 个文本文件。

我使用 ofstream 来编写这些文件。

计算此信息并将其存储在向量中所需的时间为:

  • 输出分辨率 64x64 : 13,4s
  • 输出分辨率 128x128 : 140s

将此信息写入 .txt 文件:

  • 64x64 156 秒(1,25 MB/文件)
  • 128x128 1400s(5MB/文件)

写入文件的代码:

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 << "\n\n\n";
          }
            file.close();
        }

当我使用矢量时, getSurface(pixels[i][j], l_border, r_border) 被放入矢量而不是写入文件中。

有什么办法可以加快这个过程吗?

4

2 回答 2

2

如果bestand是剩余的副本并且与 相同file,我将替换endl'\n'std::endl刷新您的输出流并破坏 iostream 缓冲获得的任何吞吐量。

如果这不是您的问题,我建议您分析您的程序。通过分析,您可以用数字代替猜测,您可以根据这些数字采取进一步的行动。

于 2012-11-11T22:50:42.420 回答
2

尝试将格式从文本更改为二进制;这可能会大大减少文件大小(和文件写入时间)。

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);
于 2012-11-11T23:42:12.320 回答