2012-01-21 11 views
-1

私はC++コンパイラmaximum size of std::vectorによって制限されていない他の回答を読んでいます。 1つの目的のためにベクトルを使用しようとしており、10^19のアイテムが必要です。stl "ベクトルが長すぎます"

typedef struct{ 
    unsigned long price, weight; 
}product; 


//inside main 
unsigned long long n = 930033404565174954; 
vector<product> psorted(n); 

プログラムは最後のステートメントでブレークします。私はnで初期化するのではなく、resize(n)をしようとした場合、その後もメッセージとプログラムブレーク:

vector<T> too long 
std::length_error at memory location 

iは、ベクターに入れた後、価格にaccourdingデータをソートする必要があります。私は何をすべきか ?

+8

なぜC++で 'typedef struct'を使用していますか?多分誰かがやるべきことを学んでいないでしょうか? :-) –

+4

930033404565174954は10^9よりもはるかに大きいです。 –

+1

'sizeof(std :: vector :: size_type)'をチェックしてください。それはあなたに最大のサイズを知らせます。 –

答えて

11

std::vectorには、持ち運びできる量に制限があります。これはstd::vector::max_sizeで照会することができ、使用できる最大サイズが返されます。

10^19個です。

10^19 * sizeof(product)のメモリがありますか?私はあなたが〜138 ExaバイトのRAMを持っていないと推測しています。さらに、64ビットモードでコンパイルする必要があります。コンパイラは壊れていません。あまりにも多くのものを割り当てようとすると、あなたの実行は破れています。

+0

どのようにデータをソートする必要がありますか? – Pheonix

+2

@Pheonix:このデータのソート方法を尋ねる場合は、RAMよりも明らかにデータが多いので、どこからデータを取得するのかを説明する必要があります。あなたの質問のタイトルは間違いです。 –

+0

ハイドープの同一性マップリダクションがそれを行います。単一のボックスであっても、ソートを可能な限り並列化し、並べ替えを高速化する可能性があります。 –

6

他の人は既に問題点を教えています。可能な解決策の1つは、膨大なメモリ不足のデータセット用に設計されたSTLの実装であるSTXXLライブラリを使用することです。

ただし、10^19の8バイト項目は8000万TBです。私は誰も大きなディスクを持っているかどうかはわかりません...

また、300MB/sという十分なディスク帯域幅を仮定すると、これは書き込みに8000年かかるでしょう!