5

私は電気工学の学生です。

割り当てとして、医療画像処理で使用される逆投影アルゴリズムを実装して画像を形成する必要があります。最終的な画像を計算するために、多くの情報が計算され、ベクトルに保持されます。最終イメージの特定の解像度 (256*256 ピクセル) では、RAM が不足するとプログラムがクラッシュするため、この情報を 90 個のテキスト ファイルに書き込むことにしました。

これらのファイルの書き込みには ofstream を使用します。

この情報を計算してからベクトルに格納するのに必要な時間は次のとおりです。

  • 出力解像度 64x64 : 13,4s
  • 出力解像度 128x128 : 140s

この情報を .txt ファイルに書き込む:

  • 64x64 156s (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 に答える