5

非常に大きなベクトルがあります (それぞれ 1024 バイトの数百万のエントリ)。ベクターの最大サイズを超えています (不正なメモリ割り当て例外が発生しています)。ベクター内の他の要素にアクセスする必要がある項目のベクターに対して再帰操作を行っています。操作は迅速に行う必要があります。速度上の理由から、ディスクへの書き込みを避けようとしています。ディスクへの書き込みを必要としないこのデータを保存する他の方法はありますか? データをディスクに書き込む必要がある場合、それを行う最も理想的な方法は何ですか>

詳細については編集してください。

データセットに対して実行している操作は、ベクトル内の他のデータ ポイントに基づいて再帰的に文字列を生成することです。データは、読み込まれるときにソートされます。50,000 から 50,000,0000 の範囲のデータ セット。

4

4 に答える 4

9

この問題を解決する最も簡単な方法は、STXXLを使用することです。これは、データがメモリに収まらない場合に透過的にディスクに書き込む、大規模な構造の STL の再実装です。

于 2013-03-15T17:19:34.180 に答える
3

コメントで述べられ、明確にされているように、問題を解決することはできません。

32 ビット システムでサイズ 1024 の 50,000,000 エントリの連続したインメモリ バッファを持つ方法を要求しました。

32 ビット システムには、4294967296 バイトのアドレス可能なメモリしかありません。51200000000 バイトのアドレス可能なメモリ、またはシステムのメモリ アドレス空間の 11.9 倍の量を要求しています。

データが連続していてメモリアドレス指定可能である必要がない場合、データがすべて一度にメモリ内にある必要がない場合、または他の要件を緩和する場合は、問題に対する答えがあるかもしれません。つまり、一部の OS は、ハック インターフェイスなどを介して、RAM に対応する値の非メモリ空間へのアクセスを公開します (8 ギガの Windows システムでは、合計 RAM の 4 ギガ以上を使用する方法があります)。

しかし、述べたように、答えは「いいえ、それはできません」です。

于 2013-03-15T17:48:14.940 に答える
0

データは連続している必要があり、格納する必要がある要素の数がわかっているため、 を作成しstd::vectorて関数を使用しreserve()、必要なサイズのメモリの連続ブロックを取得しようとします。

ベクトルを格納する際のオーバーヘッドはほとんどありません (開始と終了を管理するためのポインターがいくつかあるだけです)。これはあなたができることと同じくらい良いです。

それが失敗した場合:

  • マシンにメモリを追加します (アドレッシングまたは実装の制約に直面している場合、実際には役に立たない場合があります)
  • 生の配列に切り替える
  • 要素のサイズを縮小する方法を見つける
  • 小さなブロックで問題に取り組むことができる解決策を見つけようとする
于 2013-03-15T17:37:33.460 に答える
-1

これは 1GB のメモリです (1024KB * 10^6 = 1MB * 10^3 = 1GB)。理想的には、32 ビット マシンで最大 4GB のメモリ操作を実行できます。あなたの質問に答えるには、まず通常の malloc() 呼び出しを試して、1 GB のメモリを割り当ててください。これは、エラーなしで実行する必要があります。また、ベクターの使用中に表示される正確なエラー メッセージを貼り付けてください。

于 2013-03-15T17:16:29.620 に答える