0

私は使用しています

vector<vector<size_t>> Ar;

構造。構造体の内容は時間の経過とともに変化します。特に、ネストされた各ベクトルの長さはランダムであり、時間とともに変化します。順序は重要であり、ネストされたベクトルが空の場合は無視できません。ネストされたベクトル (m など) と外部ベクトル (n など) の最大容量を知っています。

初期化を正しく行うのに苦労しています。私が使用する場合

Ar(n);

問題はありませんが、アロケータがネストされたベクトルのサイズを認識していないため、メモリの断片化が発生します。扱おうとしているデータのサイズが大きくなると、どのような影響があるか分からないので、できれば避けたいです。ネストされたベクトルの長さを事前に修正してコンパクトな表現を取得することにより、断片化を回避しようとしますが、これを行うのに問題があります。私が使う

Ar(n,vector<size_t>(m));

ただし、ほとんどのエントリが使用されないため、これは非常に遅く、大量のメモリを浪費します。

私はこれを

vector<list<size_t> > Ar(n);

フラグメンテーションに苦しむことはありませんが、ネストされたベクトルを使用するよりもはるかに遅く実行されます。Boost::multi_array などの固定表現は、上記の 2 番目の初期化と同じ理由で、あまりにも多くのスペースを占有します。また、有用なエントリがどこで停止するかを追跡する必要があるため、実装がより困難になります。

助言がありますか?前もって感謝します。

4

2 に答える 2

1

典型的なユース ケースでコードをプロファイリングするまで、メモリの断片化が問題であるかどうかはわかりません。の前mで が非常に小さいn場合を除き、ほとんどのメモリ アクセスがシーケンシャルであるため、ボトルネックにはならないと思います。

とにかくそれを避けたい場合は、オブジェクトreserveの代わりにresizeまたは初期化を使用できmます。使用されないオブジェクトを構築するオーバーヘッドなしで、メモリを割り当てるだけで、初期化速度が向上します。

さらに、reserveベクトルの ing 容量は、効果的に使用するまで、「実際の」メモリではなく、仮想メモリのみを消費する可能性があります。

また、内部ベクトルのサイズの分布がわかっている場合は、平均値をデフォルトの長さとして使用すると、メモリの無駄を減らすのに役立つ場合があります。

いずれにせよ、std::listスペースの無駄が大きく、断片化を考慮するとさらに悪いことです。

于 2013-07-07T12:53:11.030 に答える