2017-03-27 18 views
1

変数"a=b"には、名前として1文字の'a'、値として1文字の'b'が含まれています。変数にはどのくらいのメモリが必要ですか?

一緒に2バイト。

How many characters can you store with one byte ?

変数は、ポインタを必要とします。 8バイト。

How many bytes do pointers take up ?

一緒に10バイト。

変数"a=b"には約10バイトかかりますか?そして、同じサイズの10個の変数は約100バイトかかりますか?

1000バイトの1000個の変数は、それぞれ約1MBのメモリでしょうか?

変数data.shがあります。 そのファイル内の1つの変数の値を取得する必要があります。 私はこれを関数を使って行います。 (「『関数名』 『のデータ・ファイル名』 『変数名』」で呼ばれる)

#!/usr/pkg/bin/ksh93 

readvar() { 
    while read -r line 
    do 
      typeset "${line}" 
    done < "${1}" 

    nameref indirect="${2}" 
    echo "${indirect}" 
} 

readvar datafile variable 

機能は、ラインによるファイルdata.sh行を読み込みます。 これは、各行をタイプセットしています。 それが終わったら、 関数呼び出しの変数名から という名前の参照を、data.shファイルの変数の1つに代入します。 最終的にその変数の値を出力するには。

この機能が終了すると、メモリを使い果たしなくなります。 ただし、関数が実行されている間は実行されます。

これは、data.shファイル内のすべての変数がある時点でメモリに格納されていることを意味します。

正しいですか?

実際、変数名としてip-addresses、値としてニックネームを持つファイルがあります。だから私はこれが記憶上のそのような問題ではないと思います。しかし、これを訪問者の投稿にも使用すると、変数の値はより大きなサイズになります。しかし、この関数には、毎回メモリ内に10変数しか格納されないようにすることが可能です。 しかし、変数のこのメモリ使用量を計算する私のやり方が意味をなさないのではないかと思います。

編集:

これは、ファイル全体をメモリに読み込まないようにするためのソリューションです。

input[0]=192.0.0.1 
input[1]=192.0.0.2 
input[2]=192.0.0.2 

と出力

192.0.0.1 

編集のtest.txt入力して

#!/bin/ksh 

readvar() { 
input=$(print "${2}" | sed 's/\[/\\[/g' | sed 's/\]/\\]/g') 
line=$(grep "${input}" "${1}") 
typeset ${line} 
nameref indirect="${2}" 
print "${indirect}" 
} 

readvar ./test.txt input[0] 

:もちろん

!元のポストで Bash read array from an external fileそれは言った:

# you could do some validation here 

はとても:

while read -r line 
do 
    # you could do some validation here 
    declare "$line" 
done < "$1" 

線が宣言(またはkshで植字)条件下であろう。

答えて

2

本当に心配しているのは、「どれくらいのメモリがかかりますか?しかし、 "これは無駄に多くの記憶を取らないようにするにはどうすればいいですか?"私はまずこれに答えるつもりです。元の質問に関する考えの束については、私の答えの終わりを見てください。そして、あなたはこのラインから必要な情報を抽出することができます

line=$(grep "^$2=" "$1") 

:私はあなたに関心のある1行を取得し、他のすべてを無視することはgrepを使用することを提案メモリを使用することを回避するために

result=$(echo "$line" | cut -d= -f 2) 

今変数resultはファイル$1$2に割り当てされていたであろう値が含まれています。このような結果値を複数格納する必要がないので、メモリの問題はありません。元の質問に今

、:

シェルは各変数の最大使用するメモリ量を調べるには注意が必要です。実装の際には、シェルのソースを調べる必要があります。シェルごとに異なる場合があります(kshを使用しているように見えますが、このアスペクトではbashと異なる場合があります)。バージョンによって異なることもあります。アイデアを得るために

一つの方法は、大量にシェルセット変数を作成しながら、シェルプロセスのメモリ使用量を監視するために、次のようになります。

bash -c 'a="$(head -c 1000 /dev/zero | tr "\0" x)"; for ((i=0; i<1000; i++)); do eval a${i}="$a"; done; grep ^VmPeak /proc/$$/status' 
bash -c 'a="$(head -c 1000 /dev/zero | tr "\0" x)"; for ((i=0; i<10000; i++)); do eval a${i}="$a"; done; grep ^VmPeak /proc/$$/status' 
bash -c 'a="$(head -c 1000 /dev/zero | tr "\0" x)"; for ((i=0; i<100000; i++)); do eval a${i}="$a"; done; grep ^VmPeak /proc/$$/status' 
bash -c 'a="$(head -c 1000 /dev/zero | tr "\0" x)"; for ((i=0; i<200000; i++)); do eval a${i}="$a"; done; grep ^VmPeak /proc/$$/status' 

これは設定bashが使用しているメモリの最大量を出力します1000、10000、100000、および200000の各変数には、値が1000 xの値が入ります。 (bash 4.2.25(1)を使用して-release)私のマシン上で、これは次の出力を与えた:

VmPeak: 19308 kB 
VmPeak: 30220 kB 
VmPeak: 138888 kB 
VmPeak: 259688 kB 

これは、使用するメモリが多かれ少なかれ直線的に(成長のプラス固定〜のオフセットされていることを示して17000k)、各新しい変数には1.2kBの追加メモリが必要です。

しかし、私が言ったように、他のシェルの結果は異なる場合があります。さんのsed | `#/ binに/ kshの readvar(){ 入力= $(印刷 "$ {2}":

+1

[OK]を、おかげで、私が思うに、次はあなたの方法それをやって解決策かもしれません!/$ [grep "$ {input}" "$ {1}") typeset $ {/ \\ [/ g '| sed' s/\]/\\]/g ' ライン} nameref間接= "$ {2}" プリント "$ {間接}" }入力./test.txt readvar [0] ''入力test.txtの入力データファイルと[0] = 192.0 .0.1 '出力:' 192.0.0.1' :) – azbc

関連する問題