2012-03-02 185 views
9

最近、私はC++で作業し、array[60.000][60.000]を作成する必要があります。しかし、それは大きすぎるので、私はこの配列を作成することはできません。私はfloat **arrayまたはstatic float arrayを試しましたが、何も良いことはありません。誰にもアイデアはありますか? あなたのお手伝いをありがとう!C++で大きすぎる配列を作成すると、どのように解決できますか?

+0

この大きな配列が本当に必要な場合は、メモリマップファイルの使用を検討することをお勧めします。すべてのものをメモリに収めることができない場合、あなたのOSはアクセスするページにのみマップします。 –

+0

また、あなたは* 64ビットOS上にありますか? –

+0

はい、私は窓64ビットを使用しています –

答えて

15

サイズ60,000 x 60,000のマトリックスは、3,600,000,000エレメントを持っています。

あなたがタイプfloatを使用しているので、それは次のようになります。

60,000 x 60,000 * 4 bytes = 14,400,000,000 bytes ~= 13.4 GB 

は、あなたもあなたのマシンにはその多くのメモリを持っていますか?


スタック対ヒープの問題は、十分なメモリがなければ問題ではありません。


ここでは可能性のある問題のリストです:

  • あなたは十分なメモリを持っていません。
  • 行列がグローバルに宣言されている場合は、バイナリの最大サイズを超えます。
  • マトリックスがローカル配列として宣言されている場合は、スタックを爆破します。
  • 32ビット用にコンパイルしている場合、2GB/4GBのアドレッシング制限をはるかに超えています。
+0

実際には、私は20GB持っている! –

+0

どのように失敗するのですか?エラーメッセージ?クラッシュ? – Mysticial

+0

"このアプリケーションは、異常終了するようにランタイムを要求しました。私はdevCを使い、それは私がzzzを持っているものです。 –

1

したいfloatの2次元配列を初期化するために、あなたが必要となります。

60000 * 60000 * 4約メモリの14ギガバイトであるバイト=144億バイト

。それはたくさんの記憶です。それを理論的に保持するには、かなりのRAMをインストールしたマシンはもちろんのこと、64ビットマシンを稼働させる必要があります。

さらに、このような多くのメモリを割り当てることは、ほとんどの場合ほとんど必要ではありません。ここでは最適化を行うことはできませんか?

EDIT:他の回答で、あなたのコメントから新しい情報の光で

:あなたが唯一の4GBのメモリ(RAM)を持っています。あなたのオペレーティングシステムは、ハードドライブ上で少なくとも9GBのページングを行う必要があります。しかし、ハードディスクの容量は20GBしかありません。これは、特にディスクが断片化している場合は、すべてのデータをページングするだけで十分です。最後に、明示していないので間違っている可能性があります。これは、32ビットマシンを実行している可能性が非常に高いです。これは一度に4GB以上のメモリを実際に処理することはできません。

1

実行時にメモリを割り当てます。メモリマップファイルをバッキングとして使用することを検討してください。誰もが言っているように、14ギグはたくさんの記憶です。しかし、14GBのメモリを持つコンピュータを見つけ出すことは不合理ではなく、必要に応じてメモリをページングすることも無理なことではありません。

このサイズの行列を使用すると、メモリアクセスのパフォーマンスが非常に気になる可能性があります。ターゲットアーキテクチャのキャッシュグレインを考慮することを忘れないでください。ターゲットにTLBがある場合は、大きなページを使用してTLBの負荷を軽減できます。また、十分なメモリがない場合は、ストレージI/Oがどれだけ速いかだけ気になるでしょう。

まだ明らかでない場合は、このメモリに直接/便利にアクセスするために64ビットのアドレス空間をサポートするアーキテクチャが必要です。

+0

メモリマップされたファイルは、プロセスの仮想メモリアドレス空間に "噛み付く"。したがって、32ビットプロセスは、メモリマップされたファイルであっても、2GB以上(「大規模なアドレス空間対応」の場合は4GB)_時間にアクセスすることはできません。 64ビットのプロセスが可能になりますが、メモリマップされたファイルを使用する目的を打ち負かすほど多くのメモリを直接処理することも可能になります。 OTOHの目的は、必要に応じて実際の物理ファイルの一部を選択的にロードすることであり、あまりにも多くのファイルをマッピングする必要がなければ、メモリマップされたファイルが適切です。 –

2

"60.000"は実際に "60000"を意味しますか?その場合、必要なメモリのサイズは60000 * 60000 * sizeof(float)で、およそ13.4 GBです。典型的な32ビットプロセスはわずか2 GBに制限されているので、それが適合しない理由は明らかです。

一方、マシンに十分なRAMがあると仮定して、64ビットプロセスには対応できないはずがありません。

+0

yeap、私は20GB以上のHDDと4GBのRAMを持っています –

+0

@Kingfisher 4GBのRAM?あなたはスワップに頼っているのですか?!?!? – Mysticial

+0

@Kingfisher - それはあなたの問題です - あなたはメモリ(RAM)をハードディスクスペースと混同しています。 –

関連する問題