2017-03-27 2 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 파일이 있습니다. 해당 파일에서 하나의 변수 값을 검색해야합니다. 함수를 사용하여이 작업을 수행합니다. (" '함수 이름'데이터 파일 이름 '변수 이름'"로 불림)는

#!/usr/pkg/bin/ksh93 

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

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

readvar datafile variable 

함수는 파일 data.sh 라인별로 라인을 판독한다. 그 동안 각 행을 typeset합니다. 이 작업을 완료 한 후 함수 호출의 변수 이름에서 이라는 이름의 참조를 data.sh 파일의 변수 중 하나에 지정합니다. 마지막으로 해당 변수의 값을 인쇄합니다.

기능이 완료되면 더 이상 메모리를 사용하지 않습니다. 그러나 함수가 실행되고있는 한.

이것은 data.sh 파일의 모든 변수가 어느 시점에 메모리에 저장되어 있음을 의미합니다.

맞습니까?

실제로 변수 이름과 닉네임이 ip-addresses 인 파일이 있습니다. 그래서 나는 이것이 기억에 그토록 문제가되지 않을 것이라고 생각합니다. 그러나 방문자의 게시물에 대해서도이 값을 사용하면 변수 값은 더 큰 크기가됩니다. 그러나이 함수는 매번 메모리에 예를 들어 10 개의 변수 만 저장할 수 있습니다. 그러나 변수의 메모리 사용량을 계산하는 내 방식이 의미가 있는지 궁금합니다.

편집 :

이것은 전체 파일을 메모리에로드하는 것을 피하기위한 해결책 일 수 있습니다.

입력으로
#!/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] 

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

그리고 출력

있는 test.txt

192.0.0.1 

편집 :

물론

!원래 소식 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

귀하의 실제 관심사는 "얼마나 많은 메모리가 필요합니까?" 그러나 "어떻게하면 쓸데없이 많은 기억을 피할 수 있을까?" 먼저이 질문에 대답하겠습니다. 원래의 질문에 대한 여러 생각을 보려면 내 대답의 끝 부분을 참조하십시오.

당신에게 관심이있는 한 줄을 얻기 위해 내가 GREP을 사용하도록 제안 메모리를 사용하고 다른 모든 무시할 피하기위한

: 그럼 당신은 당신이이 줄에서 필요한 정보를 추출 할 수 있습니다

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

을 :

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

지금 변수 result 파일 $1$2에 할당 된 것 값이 포함되어 있습니다. 하나 이상의 결과 값을 저장할 필요가 없으므로 메모리 문제가 없습니다.

이제 원래의 질문에 :

쉘은 각 변수를 위해 사용하는 메모리 용량을 확인하기 까다 롭습니다. 구현시 반드시 쉘 소스를 살펴 봐야합니다. 셸마다 다를 수 있습니다 (이 부분에서는 bash과 다를 수있는 ksh을 사용하는 것으로 보입니다). 또한 버전마다 다를 수 있습니다.

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의 추가 메모리가 필요합니다.

하지만 내가 말했듯이 다른 쉘의 결과는 다를 수 있습니다. !

+1

좋아, 덕분에, 나는 다음은 사용자가 원하는 방식으로 일을 해결책이 될 수 있습니다 생각 :'#/빈/ksh를 readvar() { 입력 = $ (인쇄 "$를 {2}"| 나오지도의/$ [grep "$ {input}" "$ {1}") typeset $ {/ \\ [/ g ' 라인} nameref 간접 = "$ {2}" 인쇄 "$ {} 간접" } 입력 ./test.txt readvar [0] 입력''TEST.TXT 입력 데이터 파일과 [0] = 192.0 .0.1'출력 :'192.0.0.1' :) – azbc