今日、私はベクトル要素へのアクセスがベクトルのサイズとともに遅くなるという問題に遭遇しました。自分のコードではないので投稿できませんので、ご容赦ください。できるだけ詳しく説明しようと思います。
コードの機能は次のとおりです。1。Datasetクラスは、ファイル名を含む.txtファイルを受け取ります。これらは、ロードする必要のある標準のpng画像を指しています。これはImage<T>
クラスによって行われます。画像はとして読み込まれImage<unsigned char>
、にプッシュバックされますstd::Vector
。2.データのロードが完了した後。データセットを操作するために、データセット内のベクトルにアクセスできます。したがって、次のようになります。
Dataset d;
d.init("filenames_list.txt"); //Loads the images
for(int i=0; i< d.getDatavector().size(); i++){
Image<unsigned char> current = d.getDatavector()[i];
//Do work on current image here.
}
ここで、getDatavector()はを返しますstd::Vector<Image<unsigned char> >
。画像は、幅、高さ、チャネル数の3つのintを保持し、さらにインターリーブされたデータを指すBoost共有ポインターを保持します。
小規模なテストランの場合、約150の画像を含むファイルのリストがあります。これでプログラムを実行すると正常に動作し、速度測定により次のことがわかります
Image<unsigned char> current = d.getDatavector()[i];
完了するまでに約10msかかります。ただし、1500枚の画像の完全なデータセットで作業したい場合、上記の行は完了するのに約500ミリ秒かかります。私はそれを修正するために多くの異なることを試みましたが、コードの一般的な構造とメモリによっていくらか制限されています。私が次のことをすると:
const std::Vector<Image<unsigned char> > data = d.getDatavector();
ループの前は非常に高速に実行されますが、すぐにメモリが不足します。
問題の説明がやや曖昧であることはわかっています。正確な解決策を望んでいませんが、どこを見ればよいかについてのヒントを期待しています。私は同様の問題を探しましたが、人々はベクトルと配列の一般的な速度にしか関心がないようです。私の問題は、ベクトルの長さとともに速度が低下することです!誰かがこの種の問題を見た場合、どんな提案も大歓迎です!
これまで、std :: vector :: iteratorを使用するか、(d.getDatavector()。data())をポインターとして使用して、コンテンツにアクセスしようとしました。速度を向上させるものは何もないようです。