long long 型の整数を格納するには、10^15 のオーダーのメモリを割り当てる必要があります。配列を使用して次のようなものを宣言すると
long long a[1000000000000000];
それは決してうまくいきません。では、どうすればそのような膨大な量のメモリを割り当てることができますか。
long long 型の整数を格納するには、10^15 のオーダーのメモリを割り当てる必要があります。配列を使用して次のようなものを宣言すると
long long a[1000000000000000];
それは決してうまくいきません。では、どうすればそのような膨大な量のメモリを割り当てることができますか。
通常、非常に大きな配列はメモリの仕事ではなく、ディスクの仕事です。10 15個の配列要素は、それぞれ 64 ビットで (私が思うに) 8 ペタバイトです。現時点で 8G メモリ スライスを約 15 ドルで購入できるため、マシンがそれだけの量のメモリまたはアドレス空間を処理できたとしても、約 1500 万ドルを費やすことになります。
さらに、今後の DDR4 は約 4GT/s (ギガ転送) までクロックアップされるため、各転送が 64 ビット値であったとしても、その配列をゼロに初期化するだけで約 100 万秒かかります。コードが何か有用なことを実行し始めるまで、本当に 11 日半も待っていたいと思いますか?
そして、ディスクルートに行ったとしても、それはかなりの量です。1 TB あたり (およそ) 50 ドルで、まだ 400,000 ドルであり、8,000 台のディスクを管理するための独自のソフトウェアを何らかの方法で提供する必要があるかもしれません。また、ディスク上のアレイを初期化するのにどれくらいの時間がかかるかを考えることさえ考えていません。
提案された解決策ではなく、実際の問題を示すために質問を言い換えることを検討することをお勧めします。それほど多くのストレージはまったく必要ないかもしれません。
たとえば、値の多くが 0 のままになっている配列について話している場合は、スパース配列が 1 つの方法です。
できません。あなたはこの記憶をすべて持っているわけではなく、しばらくの間それを持っていないでしょう. 単純。
編集: RAM に収まらないデータを本当に処理したい場合は、stxxlなどの大容量ストレージ データを処理するライブラリを使用できますが、動作が非常に遅くなり、常にディスク サイズの制限があります。
MPI は必要なものです。これは実際には、並列計算の問題には小さいサイズです。Lawerence Livermore National Labs の青い遺伝子 Q モンスターは、約 1.5 PB の RAM を保持しています。問題とビオラを分割するには、ブロック分解を使用する必要があります。
基本的なアプローチは、配列を多くのプロセッサ間で等しいブロックまたはチャンクに分割することです
64 ビット システムにアップグレードする必要があります。次に、64 ビット対応のコンパイラを入手して、100000000000000000 の最後に al を置きます。
疎行列の実装について聞いたことがありますか? 疎行列の 1 つでは、行列が巨大であるにもかかわらず、行列のごく一部しか使用しません。
スパース行列に関する基本的な情報は次のとおりです。実際にはすべてを使用するわけではありません。必要な数点だけ。