none
Visual Studio 2013の配列要素数に関して RRS feed

  • 質問

  • Visual Studio 2013(C言語)を利用させていただいております。

    物理学のシミュレーションを行うにあたり、非常に大きな要素数を持つ配列を扱いたいと考えております(例:floa型配列要素数10^9個など)。

    要素数は使用するマシンのメモリによって限界があると知ったため、従来のPC(メモリ8GBから)128GBメモリをもつ計算用PCへと切り替えようと考えております。この場合、マシンを切り替えれば自動的に使用できる配列要素数は大きくなるのでしょうか?(malloc関数で確保できるサイズは大きくなるのでしょうか?)

    または、Visual Studio 2013の設定の方でも何か変更が必要でしょうか?

    どうぞよろしくお願い致します。


    2016年10月6日 6:32

回答

  • 巨大メモリ(2GB 以上のメモリ領域)を使用するには 64ビット OS 上でかつ 64ビット アプリケーション として実行する必要があります。

    Visual Studio 2013 で 64ビットアプリケーション を ビルドするには下記のサイトが参考になるのではないかと思います。

    https://msdn.microsoft.com/ja-jp/library/9yb4317s(v=vs.120).aspx
    2016年10月6日 7:10
  • floatは4Byteなので4,000,000,000=4GByteとなります。
    以下、やや省略して説明します。

    まずOSですが、例えばWindow7(32bit版)の場合、
    システムが認識できる上限が4GByte(Homeエディションは2GByte)なので、
    搭載されている物理メモリーがこれを超えても使用することができません。
    従って、32bit版のOSは選択すべきではないと思います。
    64bit OSを使用することが前提になるでしょう。
    (参考)
    http://www.atmarkit.co.jp/ait/articles/0903/06/news136.html

    次にアプリケーションの構成ですが、64bit構成を選択してビルドすべきだと思います。
    この場合プロセスごとに2TByteの物理メモリが使用でき、8TByteのアドレス空間がサポートされるからです。
    (参考)
     https://msdn.microsoft.com/ja-jp/library/bb427430(v=vs.85).aspx

    ただし、巨大配列を一気にメモリーに配置する方法はあまりお勧めできません。
    この方法では処理途中で結果を確認したり、中断したり、再開したりなどがコードしづらくなります。
    一般に、巨大データを処理する場合、データはファイルに置き、
    部分をメモリー読み込んで処理する形が一般的で、かつ安全です。
    この方法の場合巨大メモリーは必要ありません。
    2016年10月6日 7:31

すべての返信

  • 巨大メモリ(2GB 以上のメモリ領域)を使用するには 64ビット OS 上でかつ 64ビット アプリケーション として実行する必要があります。

    Visual Studio 2013 で 64ビットアプリケーション を ビルドするには下記のサイトが参考になるのではないかと思います。

    https://msdn.microsoft.com/ja-jp/library/9yb4317s(v=vs.120).aspx
    2016年10月6日 7:10
  • floatは4Byteなので4,000,000,000=4GByteとなります。
    以下、やや省略して説明します。

    まずOSですが、例えばWindow7(32bit版)の場合、
    システムが認識できる上限が4GByte(Homeエディションは2GByte)なので、
    搭載されている物理メモリーがこれを超えても使用することができません。
    従って、32bit版のOSは選択すべきではないと思います。
    64bit OSを使用することが前提になるでしょう。
    (参考)
    http://www.atmarkit.co.jp/ait/articles/0903/06/news136.html

    次にアプリケーションの構成ですが、64bit構成を選択してビルドすべきだと思います。
    この場合プロセスごとに2TByteの物理メモリが使用でき、8TByteのアドレス空間がサポートされるからです。
    (参考)
     https://msdn.microsoft.com/ja-jp/library/bb427430(v=vs.85).aspx

    ただし、巨大配列を一気にメモリーに配置する方法はあまりお勧めできません。
    この方法では処理途中で結果を確認したり、中断したり、再開したりなどがコードしづらくなります。
    一般に、巨大データを処理する場合、データはファイルに置き、
    部分をメモリー読み込んで処理する形が一般的で、かつ安全です。
    この方法の場合巨大メモリーは必要ありません。
    2016年10月6日 7:31
  • ありがとうございました。

    使用OSに関して記しておらずすみません。Windows10の64bit版を使用する予定です。

    アプリケーションの構成が必要なのですね、ありがとうございました。(ファイル入出力に関して、こちらも記しておりませんですみません。一度試してみたのですが、配列のサイズが大きすぎるため、現実的な時間での計算終了ができなかったためあきらめました・・・。)

    まだわからないことも多いため、教えていただいた情報を元に勉強させていただこうと思います。

    ありがとうございました。

    2016年10月6日 8:17
  • 参考になるサイトの添付、ありがとうございました。

    64bitアプリケーションとして実行する必要があるのですね。知らなかったため、大変助かりました。

    教えていただいた情報を元にやってみようと思います。

    大変参考になりました、ありがとうございました。

    2016年10月6日 8:19