質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Linux

    4680questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • MacOS(OSX)

    2501questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Windows

    1794questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Win32 API

    313questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

  • Visual C++

    162questions

    Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

GB単位、ギガバイトクラスのメモリを確保する方法

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,981

Touhoku

score 30

分からないこと
malloc,freeは動的にメモリを確保できますがGBクラスのメモリサイズを確保できません。(処理系依存かもしれませんが出来ないことが多いと思います。)
ここで各OSでのGB単位の大きなメモリ領域確保の方法が知りたくなりましたがどうにも検索にヒットしません。
せっかく、マシンに16GBや32GBもメモリを積んでいるのだから是非、自分のプログラムでメモリを使い切ってみたいです。

知りたいこと
Windows,Linux,Mac各OS、及び32bit環境、64bit環境共にmalloc,free以外でのGBサイズのメモリを確保する方法。
複数の方法がある場合は複数返答頂けると嬉しいです。

具体的に場合分けします。物理的なメモリの空き容量には問題ないという前提です。

  • Windows
    -- 32bit環境で限界までメモリを確保する方法
    -- 64bit環境で16GBのメモリを確保する方法
  • Linux
    -- 32bit環境で限界までメモリを確保する方法
    -- 64bit環境で16GBのメモリを確保する方法
  • Mac OS X
    -- 32bit環境で限界までメモリを確保する方法
    -- 64bit環境で16GBのメモリを確保する方法

途中経過
Linuxだとmmapを利用するのが有力かな?
WidnowsだとVirtualQueryで帰ってきた値が最大の連続空き領域のようですよ。
Windows 64bit版だとmallocを利用するのが有力かな?
Mac OS Xだとvmmapが有力なのかな?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ishi9

    2016/12/08 10:06 編集

    具体的には何GB確保できないのですか?1GBの時点でもう確保できないのですか?ちなみにx64用に作ったアプリでないと4GBの制限に引っかかります。

    キャンセル

  • Touhoku

    2016/12/08 10:24

    タスクマネージャーで1GBの領域があるにも関わらず、確保できない場合があるので確実に確保する方法が知りたかったのです。32bit環境、64bit環境、場合分けでもよいですし、両環境共に対応できる方法や関数をご存知でしたらご返答お願い致します。

    キャンセル

回答 5

checkベストアンサー

+1

物理メモリと仮想メモリの区別はできていますか?

物理メモリというのは、メモリICやメモリボード等の物(物理的存在)の事です。
パソコンやマザーボード等の説明書で「メモリ容量」と書かれているのは、物理メモリの容量の事です。

計算機では複数のプロセス(実行中のプログラム)が同時並行的に動作しますが、その中には待機中のものもあったりします。そうしたプロセスが使うプログラムやデータを全て物理メモリに収容しておこうとすると、大容量の物理メモリが必要になります。また、物理メモリの全てが使い尽くされるとプログラムで使っているデータに上書きされるなど異常が生じ、システムはクラッシュする事になります。

仮想メモリというのは、物理メモリより大きな仮想的なメモリ空間に、細切れにした物理メモリを割り当てる事で、あたかも大きなメモリが存在するかのように見せる方法です。
物理メモリに割り振れないデータはハードディスクなどの補助記憶装置に記録しておいて、そのデータが必要になったら読み出して物理メモリに戻す。物理メモリ上のデータが当面使われなくなる(それを使っているプロセスがアイドル状態になった等)とデータをハードディスクに記録しておいて、物理メモリを他のプロセスが使えるようにする。仮想メモリは、このような動作で実現されています。
物理メモリ、ハードディスクだけではなく、仮想メモリのメモリ空間と物理メモリの空間との対応付けをするハードウェア(MMU(Memory Management Unit))が使われます。(MMUはCPUチップに内蔵されています)
物理メモリは、ハードディスクに比べて2桁ほど値段が高いので、仮想メモリが使われるのが一般的です。(物理メモリ 16GB(DDR4 8GB x2枚)とハードディスク 3TBがどちらも1万円弱。でも、容量は200倍ほど違う)

==  ==
質問にある「マシンに16GBや32GBもメモリを積んで」とか、コメントの「タスクマネージャーで1GBの領域がある」とかは、物理メモリに関するものです。
そして、Linux,Windows,MacOSなど、現在のほとんどの基本システムは仮想メモリを利用していて、malloc,freeなどのAPIは仮想メモリを操作するためのものです。
これらが区別されずに書かれているので、大丈夫かなぁという感じを受けました。

== ここから本題 ==
物理メモリ:
物理メモリの管理(物理メモリをどう使うか)は基本システムがやっているので、ユーザが物理メモリの一部を確保するという事は、できません。基礎システムのパラメータを変える事で、物理メモリの使われ方に影響を与えられるだけです。
タスクマネージャで使われていない物理メモリの容量が大きかったとしても、それを直接使うことは出来ないのです。

仮想メモリ:
仮想メモリの最大容量は、物理メモリにあったデータを保存するハードディスク上のファイル(ページファイル)の容量と一致します。ページファイルを大きくすることで、仮想メモリ空間を大きくすると、大きなメモリ領域を確保しやすくなります。

例えば、物理メモリ16GBのマシンでページファイルを24GBにしてあって、1GBのメモリ領域の確保が困難だというのであれば、ページファイルを32GBにすることで解決するはずです。
物理メモリと仮想メモリの容量比が大きくなると、計算機のパフォーマンスが下がる(メモリとハードディスクの間の転送がしょっちゅう起こるようになるため)ので、極端にページファイルを大きくすることは勧められません。
(Windows7であれば、コントロールパネル->システムとセキュリティ->システム の中の 「システムの詳細設定」の「詳細設定」タブの中の「パフォーマンス」の設定の中の「詳細設定」タグの中に仮想メモリの設定をするところがあります)

既に、多くの方が指摘しているように32bitのCPUでは32ビットでメモリのアドレスを指定する必要がありますから、2の32乗(4G,約40億)が物理的な限界になります。
また、基本システムの設定によっても上限は変わります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/26 06:49

    物理メモリと仮想メモリの違いの詳しい説明ありがとうございました。どうやら私はそこの所をよく理解していない節があったので質問がちぐはぐになっている感じがございました。質問主意が上手く伝わらず反省しています。

    キャンセル

+1

こんにちは。

malloc,freeは動的にメモリを確保できますがGBクラスのメモリサイズを確保できません。(処理系依存かもしれませんが出来ないことが多いと思います。)

具体的に確保できなかった例を書いた方が、的確な回答を貰えると思いますよ。
malloc自体に特に制限があると言う話は聞かないですから、普通は確保できることを期待しますので。

ところで、仮想メモリがあるので物理的な連続領域は不要ですが、仮想メモリ空間が分断されていたら、各塊のサイズを超える連続したメモリを確保することは不可能ですね。
昔からあるテクニックですが「最大サイズ確保→エラーが発生したらちょっとサイズを減らして取れなくなるまで確保→取れなくなったら更にサイズを減らして取れなくなるまで確保→以下同文」で限界まで確保できる可能性は高いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/26 06:50

    なるほど。この方法を既存のAPIで実現できれば可能な限りのメモリを確保できそうです。情報ありがとうございました。

    キャンセル

  • 2016/12/26 12:03

    たぶん、普通にmallocで取れると思います。
    私はこれをやったことはないので何か意外な制限があるかも知れませんね。
    もし、その制限をご存知なら教えてください。

    キャンセル

0

フツーに確保できました。 Windows 10 x64, Visual C++ 2015 x64

#include <stdlib.h>
#include <stdio.h>

int main() {
  size_t size = 1024UL*1024UL*1024UL;
  void* p = malloc(size);
  if ( p != NULL ) printf("%zu allocated\n", size);
  free(p);
  return 0;
}

X86だとキツいかもですねー

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/08 10:43 編集

    Windows XP 32bit上の環境での実験です。これが私の環境依存ならばepistemeさんのWindows 64bit版上でのギガバイト単位のメモリ確保はmallocでも十分対応できるという考えでよろしいでしょうか?

    キャンセル

  • 2016/12/08 10:47

    だと思いますよ。他のプロセスがメモリじゃぶじゃぶ使ってたら確保できないのは当然としても。

    キャンセル

  • 2016/12/26 06:52

    ご返信ありがとうございました。新しい知見を得ることが出来ました。

    キャンセル

0

例えば UNIX 系ですと、ハードレベルでの制限の他に、各プロセス単位に「利用可能なアドレス空間のサイズ」(ハードレベルの制限を超えることはできない)を設定できます。

そのような制限をかけられているとかないですかね。

Windows(32bit) の場合、1プロセス=1データセグメント=4GB の絶対的な限界があるうえに、上位1GBをシステムに予約されている(昔は2GB)ので、3GBが限界だったかと思います。
※ただしこれはAPIによるものなので、デバイスドライバレベルでなら話が変わります。現に32bit機で4GBを超えるメモリを積んだ場合に、Windowsから使えない部分をRAMディスクに転用するドライバがありますね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/08 10:31

    なるほど。UNIXの場合は各プロセス単位で制限がかけられている場合があるのですね。情報ありがとうございます。
    32bitシステムの場合の情報もありがとうございました。
    具体的な方法をご存じの方がいらっしゃいましたらぜひご返答お願い致します。

    キャンセル

  • 2016/12/08 11:28

    どのようなOSでも似通っていますが、メモリを確保するということは何らかの管理領域も合わせて使用しています。そして管理領域も(当然ながら)限界があります。
    場合によっては「メモリは空いているけれども管理領域がない」(ものすごく細切れにメモリを確保した為に管理領域が枯渇した)ためにメモリ確保できない、という可能性もありますから、実装依存どころか実行環境依存しますね。

    キャンセル

  • 2016/12/26 06:51

    なるほど。実行環境に依存する問題なのですね。情報ありがとうございました。

    キャンセル

0

メモリを確保するには連続した空き領域が必要です。
なので、空いてる分全て使えるわけではないです。

VirtualQueryを使って最大の連続空き領域を調べるというのが一番現実的?
すいません、私も試した事無いのであまり確証はありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/08 10:49

    なるほど。連続した空き領域が無いと確実に確保できるというわけではないと。盲点でした。確かにそのとおりですね。Windowsの場合、VirtualQueryで最大の連続空き領域を調べてその結果の値がそのマシンで現在利用できる最大のメモリ領域という事だと――。情報ありがとうございました。

    キャンセル

  • 2016/12/08 10:55

    すいません、そうですね。windowsの話ですね。
    ちなみにmacだとvmmapを使うのがいいのかな?
    これも試したこと無いのでさっぱりですが

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Linux

    4680questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • MacOS(OSX)

    2501questions

    MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

  • Windows

    1794questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Win32 API

    313questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

  • Visual C++

    162questions

    Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。