最近、私はC++で作業し、array[60.000][60.000]
を作成する必要があります。しかし、それは大きすぎるので、私はこの配列を作成することはできません。私はfloat **array
またはstatic float array
を試しましたが、何も良いことはありません。誰にもアイデアはありますか? あなたのお手伝いをありがとう!C++で大きすぎる配列を作成すると、どのように解決できますか?
答えて
サイズ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のアドレッシング制限をはるかに超えています。
実際には、私は20GB持っている! –
どのように失敗するのですか?エラーメッセージ?クラッシュ? – Mysticial
"このアプリケーションは、異常終了するようにランタイムを要求しました。私はdevCを使い、それは私がzzzを持っているものです。 –
したいfloatの2次元配列を初期化するために、あなたが必要となります。
60000 * 60000 * 4約メモリの14ギガバイトであるバイト=144億バイト
。それはたくさんの記憶です。それを理論的に保持するには、かなりのRAMをインストールしたマシンはもちろんのこと、64ビットマシンを稼働させる必要があります。
さらに、このような多くのメモリを割り当てることは、ほとんどの場合ほとんど必要ではありません。ここでは最適化を行うことはできませんか?
EDIT:他の回答で、あなたのコメントから新しい情報の光で
:あなたが唯一の4GBのメモリ(RAM)を持っています。あなたのオペレーティングシステムは、ハードドライブ上で少なくとも9GBのページングを行う必要があります。しかし、ハードディスクの容量は20GBしかありません。これは、特にディスクが断片化している場合は、すべてのデータをページングするだけで十分です。最後に、明示していないので間違っている可能性があります。これは、32ビットマシンを実行している可能性が非常に高いです。これは一度に4GB以上のメモリを実際に処理することはできません。
実行時にメモリを割り当てます。メモリマップファイルをバッキングとして使用することを検討してください。誰もが言っているように、14ギグはたくさんの記憶です。しかし、14GBのメモリを持つコンピュータを見つけ出すことは不合理ではなく、必要に応じてメモリをページングすることも無理なことではありません。
このサイズの行列を使用すると、メモリアクセスのパフォーマンスが非常に気になる可能性があります。ターゲットアーキテクチャのキャッシュグレインを考慮することを忘れないでください。ターゲットにTLBがある場合は、大きなページを使用してTLBの負荷を軽減できます。また、十分なメモリがない場合は、ストレージI/Oがどれだけ速いかだけ気になるでしょう。
まだ明らかでない場合は、このメモリに直接/便利にアクセスするために64ビットのアドレス空間をサポートするアーキテクチャが必要です。
メモリマップされたファイルは、プロセスの仮想メモリアドレス空間に "噛み付く"。したがって、32ビットプロセスは、メモリマップされたファイルであっても、2GB以上(「大規模なアドレス空間対応」の場合は4GB)_時間にアクセスすることはできません。 64ビットのプロセスが可能になりますが、メモリマップされたファイルを使用する目的を打ち負かすほど多くのメモリを直接処理することも可能になります。 OTOHの目的は、必要に応じて実際の物理ファイルの一部を選択的にロードすることであり、あまりにも多くのファイルをマッピングする必要がなければ、メモリマップされたファイルが適切です。 –
"60.000"は実際に "60000"を意味しますか?その場合、必要なメモリのサイズは60000 * 60000 * sizeof(float)
で、およそ13.4 GBです。典型的な32ビットプロセスはわずか2 GBに制限されているので、それが適合しない理由は明らかです。
一方、マシンに十分なRAMがあると仮定して、64ビットプロセスには対応できないはずがありません。
yeap、私は20GB以上のHDDと4GBのRAMを持っています –
@Kingfisher 4GBのRAM?あなたはスワップに頼っているのですか?!?!? – Mysticial
@Kingfisher - それはあなたの問題です - あなたはメモリ(RAM)をハードディスクスペースと混同しています。 –
- 1. C#でAntlr4で大きなファイルを解析すると、OutOfMemoryExceptionがどのように解決されますか?
- 2. 文字列をint32に解析するとC#が大きすぎます
- 3. ValueError:配列が大きすぎます
- 4. モデルが鍛造で大きすぎるときは、それはどのようにそれを解決するために点滅しますか?
- 5. IJVMでどのようにprobleを解決できますか?
- 6. anacondaでCondaHTTPErrorをどのように解決できますか?
- 7. フラグが多すぎるenumです。最後の値が大きすぎます。どうすれば解決できますか?
- 8. どのようにC#で接続タイムアウトエラーを解決できますか?
- 9. 私のhadoop設定パラメータio.sort.factorが小さすぎるか大きすぎるかどうかをどのように知ることができますか?
- 10. このコンパイルエラーをどのように解決できますか?
- 11. R.layout.mainを解決するにはどうすればよいですか?アンドロイドアプリで解決できませんか?
- 12. 私はブートストラップグリッドをどのように解決できますか?
- 13. セグメンテーションフォルト(コアダンプ)をどのように解決できますか?
- 14. どのように解決のステップを知ることができますか?
- 15. バイト配列はどのように操作して作成できますか?
- 16. ChromeとFirefoxで大きなマージンの問題を解決するにはどうすればよいですか?
- 17. このレイヤードネットワークはどのように解決できますか?
- 18. エラーウェブサイトでクエリを作成しようとしたときに 'クエリ用パケットが大きすぎます'
- 19. ポインタが大きすぎるとどうなりますか?
- 20. どのように "フェーズドアレイツールボックス"を解決することができます
- 21. c#.Netでハッシュテーブルの配列を作成できますか?
- 22. どのようにSOAPオブジェクトの作成エラーを解決するのですか?
- 23. C#でTableSectionを作成するときに、どのようにパラメータを追加できますか?
- 24. "-bash:corelist:command not found"というエラーをどのように解決できますか?
- 25. 複数の型にできるC++配列を作成する
- 26. C++で配列の配列を作ることはできますか?
- 27. nodejs多次元配列はどのように作成できますか?
- 28. 確かに大きな配列を作成するのは悪いですか?
- 29. PHPでは、どのように大きな配列を返すのですか?
- 30. C++/SDLどのように配列を上書きするか?
この大きな配列が本当に必要な場合は、メモリマップファイルの使用を検討することをお勧めします。すべてのものをメモリに収めることができない場合、あなたのOSはアクセスするページにのみマップします。 –
また、あなたは* 64ビットOS上にありますか? –
はい、私は窓64ビットを使用しています –