トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-R備忘録/17

R備忘録 /状態空間モデリング/donlp2/その他のメモ

R備忘録 - 記事一覧

64ビットLinux機で2Gバイト以上のメモリを使う その

  • 投稿者: ひな
  • カテゴリ: なし
  • 優先度: 普通
  • 状態: 完了
  • 日時: 2008年12月08日 19時48分47秒

内容

  • Windows2000上で
  • 今回はお手軽に動作確認ができる方法としてVMware Playerを使うことに
  • ホストOSはWindows2000でメモリは4Gバイト
  • CPUはAthlon64
  • OSはGentoo Linux AMD64を使うことに

OSを準備

  • CDイメージはinstall-amd64-minimal-2008.0-r1.isoを使用
  • ゲストOSのメモリは3Gバイト.4Gで指定したら無理!って怒られた.

まずはC言語で

  • とりあえずいろいろ設定やらデーモン等のインストールの合間を使ってC言語で2G以上使えるのかを確認.Rをインストールできる状態になるのはもうちょっと先なもので・・・
    • Gentooはインストールから手作り感満載.
    • CentOS等Red Hat系みたいに「不必要なバイナリも含めて入れちゃう」な感じではない.
    • カーネルのコンパイルからやって、とりあえず起動するようになっても、いろんなデーモンとか、エディターとかX11とか自分で指定して入れてあげないといけないのです.
    • だから、そんなインストールの裏側でC言語でテスト

Cのソース

  • 単純明快、というかこれで確認していることになるんですか?
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char c;
        char *po;

        printf("Hello, World!\n");

        po = (char *)malloc(sizeof(char) * 1024*1024*1024*2.7);
        if (po == NULL) exit(1);

        printf("input char > ");
        scanf("%c", &c);
        return 0;
}
  • キャラクタ型の変数を動的に確保しています.キャラクタ型は多分1個?で1バイトなので、「1024*1024*1024」で1Gバイト.なのでこの例では2.7Gバイトメモリを確保することになるのかな?
  • 途中でキー入力を待っているのは、待っている間に「ps」コマンド等でメモリ使用状況を確認するためです.

コンパイル

gcc test.c
  • 「a.out」という実行ファイルができる

実行

# ./a.out
Hello, World!
input char >
  • psコマンドでメモリ使用状況を確認
# ps aux | grep a.out
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3850  0.0  0.0 2834720  444 pts/5    S+   04:34   0:00 ./a.out
  • ということで「vsz」で約2.8G使ってます.ただし、物理メモリ上では444kバイトしか使ってないことに.
    • ちなみに同じソースコードを32ビット版GentooLinux上で実行するとメモリ確保できなくて「if (po == NULL) exit(1);」で終了します.
  • そうかこの変数をなにか文字で埋めていってみよう.

Cのソース

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

int main(void)
{
        char c;
        char *po;
        int i;

        printf("Hello, World!\n");

        po = (char *)malloc(sizeof(char) * 1024*1024*1024*2.7);
        if (po == NULL) exit(1);

        for( i=0; i<1024*1024*1024; i++ ){
            po[i] = 'c';
        }
        printf("input char > ");
        scanf("%c", &c);
        return 0;
}
  • 最初の1Gを「c」で埋めてみた

コンパイル

gcc test2.c -o test2

実行と結果

# ./test2
Hello, World!
input char >
  • 「ps」
ps aux | grep test2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3933 65.2 33.9 2834720 1049020 pts/5 S+   04:46   0:08 ./test2
  • と物理メモリが1Gバイトに.ほほう
  • では
        for( i=0; i<1024*1024*1024; i++ ){
            po[i] = 'c';
        }
        for( i=0; i<1024*1024*1024*2.7; i++ ){
            po[i] = 'c';
        }
  • に替えた場合

Rで

ダウンロード

$ links http://cran.r-project.org/mirrors.html
  • 「links」もはじめは入ってないので、「emerge -v links」でインストールする

インストール

  • 解凍とcd
tar xvf R-2.8.0.tar.gz
cd R-2.8.0
  • コンフィグ.オプションなし
./configure
  • コンフィグ成功
R is now configured for x86_64-unknown-linux-gnu

  Source directory:          .
  Installation directory:    /usr/local

  C compiler:                gcc -std=gnu99  -g -O2
  Fortran 77 compiler:       gfortran  -g -O2

  C++ compiler:              g++  -g -O2
  Fortran 90/95 compiler:    gfortran -g -O2
  Obj-C compiler:

  Interfaces supported:      X11
  External libraries:        readline
  Additional capabilities:   iconv, MBCS, NLS
  Options enabled:           shared BLAS, R profiling

  Recommended packages:      yes

configure: WARNING: you cannot build DVI versions of the R manuals
configure: WARNING: you cannot build PDF versions of the R manuals
configure: WARNING: I could not determine a browser
configure: WARNING: I could not determine a PDF viewer
  • でもPDFもブラウザもインストールしてないからこの調子.はぁぁ
  • コンパイル
make
LANG=C LC_ALL=C make check
  • インストール
    • suでroot権限になって
make install

メモリ消費のテスト

  • マシンの情報
$ uname -a
Linux mac_name 2.6.26-gentoo-r4 #1 SMP Mon Dec 8 19:55:40 JST 2008 $
x86_64 AMD Athlon(tm) 64 Processor 3200+ AuthenticAMD GNU/Linux
  • テスト
> gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 105470  5.7     350000 18.7   350000 18.7
Vcells 119344  1.0     786432  6.0   455167  3.5
> a <- matrix(0, 1024*1024)
> gc()
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  105476  5.7     350000 18.7   350000 18.7
Vcells 1167921  9.0    1625057 12.4  1167940  9.0
> a <- matrix(0, 1024*1024*100)
> gc()
            used  (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells    105476   5.7     350000  18.7    350000  18.7
Vcells 104976945 801.0  117230563 894.4 106025542 809.0
> a <- matrix(0, 1024*1024*200)
> gc()
            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    105476    5.7     350000   18.7    350000   18.7
Vcells 209834545 1601.0  330671920 2522.9 314692166 2401.0
> rm(list="a")
> gc()
         used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells 105611  5.7     350000   18.7    350000   18.7
Vcells 119369  1.0  264537536 2018.3 314692166 2401.0
> a <- matrix(0, 1024*1024*300)
> gc()
            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    105615    5.7     350000   18.7    350000   18.7
Vcells 314692170 2401.0  347285542 2649.6 314692190 2401.0
> rm(list="a")
> gc()
         used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells 105611  5.7     350000   18.7    350000   18.7
Vcells 119369  1.0  277828433 2119.7 314692322 2401.0
> a <- matrix(0, 1024*1024*400)
> gc()
            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    105615    5.7     350000   18.7    350000   18.7
Vcells 419549770 3201.0  462891046 3531.6 419549790 3201.0
  • ゲストOSのメモリは3Gバイトなのに!おかしい!謎!謎!
  • 「ps」の結果
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
admin    17254  7.9 97.0 3336556 2391852 pts/2 S+   08:59   1:26 /usr/local/lib64/R/bin/exec/R
  • ふむ、物理メモリは2.4Gしか使っていないことに???
  • だけどとりあえず2Gバイト以上のメモリを消費することに成功!!?
    • ああ、スワップしてるのかな

コメント