데이터 사이언티스트, 머신러닝 전문가가 되기 위해서는 많은 것을 배우고 체득해야 합니다. 주어진 시간내에 많은 것을 배우려면 요령이 필요한데요, 지극히 저 개인적인 관점에서 데이터 사이언티스트나 머신러닝 전문가가 되기 위한 5가지 학습법을 소개해 드립니다.

 

1. 데이터 가공/처리와 분석 능력을 키우세요

 

실전에서 머신러닝 애플리케이션을 적용할 때 절반 이상의 영역은 데이터 전처리(Preprocessing), 피처 엔지니어링(Feature Engineering)과 같은 데이터 가공/처리 부분입니다. 또한 데이터의 구성 및 피처들간의 관계, 분포도, 왜곡도, 상관관계, 아웃라이어 검출등의 데이터 분석에도 많은 시간이 소모 됩니다.

 

오늘날 머신러닝 알고리즘은 매우 편리하게 패키징 되어, 일반화된 함수 호출로 쉽게 구현이 가능합니다. 오히려 머신러닝 알고리즘이 잘 동작할 수 있도록 데이터를 효과적으로 가공/처리하는 것이 머신러닝 애플리케이션 구현에 있어 더 중요할 수 있습니다. 실제로 캐글의 여러 경연 과제에서는 이러한 데이터 처리가 높은 순위를 달성하는데 가장 중요한 요소가 되기도 합니다.

 

이를 위해 사이킷런/케라스 등의 머신러닝 패키지 뿐만 아니라 넘파이와 판다스에 대한 공부도 같이 병행해야 합니다. 특히 회사에서는 대부분 RDBMS 형태로 데이터를 가지고 있기 때문에 SQL과 데이터 모델에 대한 이해가 매우 중요합니다.

 

https://www.jokejive.com/topic/data

 

2. 무조건 따라해 보세요.

 

예나 지금이나 개발 감각을 키우는 가장 빠른 방법중의 하나는 좋은 소스 코드를 무작정 따라해 보는 것입니다. 머신러닝 개발도 예외가 아니며, 캐글(www.kaggle.com)은 이를 위한 최고의 장소입니다. 실전에서 얼마나 다양한 머신러닝 애플리케이션들을 직접 구현해 보고 많은 문제점들을 해결해 보았는지는 머신러닝 능력을 결정하는 중요 척도 입니다. 캐글은 이러한 실전 능력을 배양할 수 있는 가장 좋은 학습 공간이자 놀이터 입니다.

 

물론 캐글을 처음 접하거나, 아직 머신러닝 코드에 익숙하지 않은 분들의 캐글의 많은 자료와 소스코드들을 제대로 이해하기 어려 울 수 있습니다. 하지만 이건 누구나 마찬가지입니다. 일단 몰라도 캐글에 주기적으로 발을 붙이고 쉬운 커널부터 천천히 학습해 보십시요. 캐글을 여러분의 놀이터로 삼느냐, 그렇지 않느냐에 따라 여러분의 실력이 크게 달라 질 수 있습니다.

 

 

3. 이론과 실습은 언제나 낄끼빠빠

 

효과적인 학습은 이론과 실습의 균형을 잘 맞추는 것입니다. 그런데 이론과 실습에 투자하는 시간 비율은 어떻게 정하면 좋을까요? 사실 황금 비율은 없지만 저의 지극히 개인적인 의견으로는 머신러닝이 실용학문임을 감안하고 실습에 많은 시간을 투자하는게 좋다고 생각합니다.

 

이는 데이터 사이언티스트가 알아야 할 확률/통계/선형대수나 머신러닝 알고리즘 이론등에 대한 공부를 소홀히 하자는 얘기가 아닙니다. 우리가 많은 시간을 들여서 이론을 배우는 이유, 특히 기반 이론을 배우는 이유는 확실한 기반 개념을 확립해야만 더 어려운 문제를 해결 할 수 있기 때문입니다. 하지만 안타까운것은 확률통계/선형대수/머신러닝 수식과 이론 알고리즘에 너무 많은 시간을 투자하다가 수식의 벽에 막혀 본 게임도 하기전에 지쳐서 떨어져 나가는 경우입니다.

 

만일 본인이 리서치나 연구원쪽으로 방향을 정했다면 당연히 수식과 이론에 시간을 많이 투자하는 것이 맞습니다. 하지만 현업에서 데이터 분석 기반의 데이터 사이언티스트가 되기를 원한다면 어느정도 선에서 이론을 이해하고, 다양한 실습과 실전 문제 해결 경험을 쌓는것이 더 중요할 수 있습니다.

 

이론과 실습을 다양하게 반복하면서 공부하다보면 이론과 실습이 언제 끼고 언제 빠져야 하는지, 어떻게 시간 배분을 해야 할지 감을 잡을 수 있습니다. 기반 개념 확립을 위한 이론 학습, 그리고 개발/구현을 통해 기반 개념을 강화하는 균형을 통해 여러분의 실력을 향상 시킬 수 있으려면 이러한 시간 배분을 의식적으로 하도록 노력해야 합니다.

 

 

4. 작심 삼일을 빠르게 반복하십시요.

 

좋은 와인은 시간이 필요합니다. 데이터 사이언티스트가 된다는 것은 배움의 긴 여정을 떠나는 것이고, 그 과정에서 좌절하고 멈추기 쉽습니다. 어렵다고 생각되면 잠시 여유를 가지십시요. 그리고 다시 시작하십시요. 

 

우리의 뇌는 자는 동안 낮동안 배웠던 많은 것들을 재정돈/정렬 과정을 통해 배움을 한단계 더 성숙시킬 수 있게 만들어져 있습니다. 이 과정에서 중요한것은 우리의 뇌가 식기 전에 다시 돌아와야 한다는 것입니다. 작심 삼일의 적당한 휴식기를 가지고 빠르게 복귀할 수 있는 정신력을 발휘한다면 작심 삼일이 작심 일주일, 작심 한달, 작심 6개월이 될 수 있습니다. 

 

저는 개인적으로 '정신 사나워' 방식의 공부도 좋아합니다. 알고리즘 공부하다가 이해가 안되면 Kaggle의 경연대회 문제를 풀어보거나, 다시 지루해지면 다른 알고리즘이나 또 다른 Kaggle 구현 문제를 풀어 보는 방식입니다(그래도 지루하면 서점이나 도서관에 가서 관련 책들을 흝어보는 시간을 가집니다). 집중을 중시하는 분들에게는 어색한 방식이지만 저에게는 흥미를 잃지 않고 지속적으로 학습을 가능하게 해주는 방식입니다.

 

5. 늘 한단계 더 어려운 문제에 도전해보세요.

 

헬스클럽에서 Personal Training을 시작하면 트레이너들이 늘 하는 말이 있습니다. '근육은 찢어지는 과정을 통해 더 커지고 성장합니다'. 운동을 몇시간동안 오래 했느냐 보다 근육이 찢어질만큼 고강도로 했느냐가 근육 성장에 더 중요합니다.  머신 러닝을 배우는 과정 역시 마찬가지 입니다.

 

처음에는 Toy 데이터 세트로 시작했다가 수백개의 컬럼을 가진 여러개의 데이터 세트를 문제를 확장하고 어느정도 자신감이 붙으면 이제는 Kaggle의 다른 데이터 사이언티스트들과 경쟁해보십시요. 익숙하지 않은, 그리고 어려운 경연 대회의 문제들을 풀어 본다면, 자신의 실력을 키울 수 있다는 믿음을 잊지 마십시요.

 

어려운 문제에 도전하면 누구나 다 처음에는 떨어져 나갑니다. 중요한 것은 다시 도전하는 것이며, 이번에 도전할 때는 지난번 보다 조금만 더 오래, 조금만 더 많이 버티는 겁니다.

 

 

 

 

배움의 왕도는 배움 자체를 즐기는 것입니다. 하지만 이런 능력을 보유한 사람은 매우 드뭅니다. 만약 즐길 수 없다면 즐기는 척 우리의 뇌를 속여 보는건 어떨까요?

 

행복해서 웃는게 아니라 웃어서 행복하다는 말도 있듯이, 데이터 사이언티스가 익혀야할 많은 것들을 배우면서 지겨움과 극복하기 어려운 문제에 봉착할 때 마다 잠시 내려놓거나, 오히려 거리낌없이 다른 데이터 사이언티스에게 도움을 요청한다거나, 머신러닝 프로젝트의 일원으로 직접 구현에 참여하는등 지금 봉착한 문제에서 잠깐 떠나서 다른 해결책을 찾아 보는 겁니다.

 

 

언제나 잊지 말아야 할 것은 우리의 두뇌는 우리가 생각한 것 보다 훨씬 대단한걸 해낼 수 있는 능력이 있다는 것입니다. 

1. LOG_ARCHIVE_DEST_n은 archive log 파일을 최대 10개 까지 서로 다른 Directory 에 분산 시킬 수 있게 함. 
그리고 해당 Directory 가 Local 이 아니고 원격지에 있는 remote 서버도 가능하게 함. 
파라미터 설정 시 'LOCATION= /해당디렉토리' 로 설정함. 

2. LOG_ARCHIVE_DEST 는 과거에 사용하던 파라미터이며 , LOG_ARCHIVE_DUPLEX_DEST와 함께 사용할 경우 최대 2개의 서로 다른 Directory에 archive file을 위치 시킬 수 있음. 단 Local 시스템에만 적용 가능. 

3. 따라서 LOG_ARCHIVE_DEST_n 사용이 보다 권장됨. 만일 LOG_ARCHIVE_DEST 가 설정되어 있으면 아래와 같이 Disable 시킴. 
 
alter system set log_archive_duplex_dest = '';
alter system set log_archive_dest = '';

log_archive_dest_state_n 파라미터도 활성화 되었는지 확인. 비 활성화 되었다면 아래와 같이 enable 시킴

show parameter log_archive_dest_state;

alter system set log_archive_dest_state_1 = enable;
alter system set log_archive_dest_state_2 = enable;

alter system set log_archive_dest_1='location=/dbarch1';
alter system set log_archive_dest_2='location=/dbarch2';

MethodInitialization ParameterHostExample
1LOG_ARCHIVE_DEST_nLocal or remoteLOG_ARCHIVE_DEST_1 = 'LOCATION=/disk1/arc'
where: n is an integer from 1 to 10LOG_ARCHIVE_DEST_2 = 'SERVICE=standby1'
2LOG_ARCHIVE_DEST andLocal onlyLOG_ARCHIVE_DEST = '/disk1/arc'
LOG_ARCHIVE_DUPLEX_DESTLOG_ARCHIVE_DUPLEX_DEST = '/disk2/arc'


4.  아카이브 로그를 이중화 시키되 이중 한 곳은 FRA 를 사용하게 하는 법. 

LOG_ARCHIVE_DEST_1 = 'LOCATION=/arc_dest1'
LOG_ARCHIVE_DEST_2 = 'LOCATION=USE_DB_RECOVERY_FILE_DEST'

Flash Recovery Area ( FRA ) 설정하는 방법


1.  log_archive_dest 와 log_archive_duplex_dest 를 Disable 한다. 
alter system set log_archive_duplex_dest = '';
alter system set log_archive_dest = '';


2. FRA 크기를 db_recovery_file_size로, FRA 디렉토리 위치를 'db_recovery_file_dest' 로 설정한다.  
alter system set db_recovery_file_size = 4G;
alter system set db_recovery_file_dest = '/home/oracle/flasharea';

3. FRA 중에 사용되고 있는 영역 확인

SQL> SELECT * FROM V$RECOVERY_FILE_DEST;

NAME            SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
--------------  ----------- ---------- ----------------- ---------------
/mydisk/rcva     5368709120 109240320             256000              28

4. FRA를 차지하고 있는 Object들의 사용 현황

SQL> SELECT * FROM V$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE                   0                         0               0
ONLINELOG                     2                         0              22
ARCHIVELOG                 4.05                      2.01              31
BACKUPPIECE                3.94                      3.86               8
IMAGECOPY                 15.64                     10.43              66
FLASHBACKLOG                .08                         0               1

IPython 에서 matplotlib import 시 cannot import name 'QtCore' 오류 발생 처리


Think Stats 2 PDF 를 보다가 첫 SOURCE 코드를 테스트 시 오류가 발생하였다.

확인해 보니 IPython에서 matplotlib 를 import 시 cannot import name 'QtCore' 오류 발생 처리


내 PC의 Python 버전은 3.4이다. , matplotlib 를 import 시 QtCore 5와 QtCore 4 간에 불일치로 문제가 발생되는 것 같다.

아래와 같이 matplotlib.use("Qt5Agg") 를 IPython에서 수행하여 해결하였다. 이 때 주의할 사항이 있는데 오류가 난 Ipython 콘솔에서 해당 설정을 수행하면 Warning 메시지가 나오면서 이미 Backend가 설정되어 해당 설정은 적용되지 않는다는 것이다. 반드시 새로운 콘솔창을 열고 해당 명령어를 입력하자.


import matplotlib


matplotlib.use("Qt5Agg")


C:\Anaconda3\lib\site-packages\matplotlib\__init__.py:1350: UserWarning:  This call to matplotlib.use() has no effect
because the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

반드시 새로운 콘솔창을 열고 해당 메시지를 입력하자.



정규 표현식을 아래와 같이 간략하게 정리하였다.

"손에 잡히는 정규 표현식" 에서 발췌한 것이다.


유형

정규식

설명

기본 메타 문자

.

모든 문자와 일치

|

왼쪽 혹은 오른쪽과 일지

[ ]

문자 집합 구성원 중 하나와 일치

[ ^ ]

문자 집합 구성원을 제외하고 일치

-

범위정의 [ A-Z] 와 같은 형태

\

다음에 오는 특수 문자를 이스케이프 함

수량자

*

문자가 없는 경우나 하나 이상 연속하는 문자

*?

게으른 * 문자

+

문자 하나 이상 찾기

+?

게으른 + 문자

?

문자가 없거나 하나인 문자찾기

{n}

정확히 요소와 n번 일치

{m,n}

요소와 m에서 n 번 일치

{n,}

요소와 n 번 이상 일치

{n,}?

게으른 {n,}


유형

정규식

설명

특수 문자

[\b]

백스페이스

\c

제어 문자와 일치

\d

모든 숫자와 일치

\D

숫자가 아닌 모든 것과 일치

\w

모든 숫자와 문자,밑줄과 일치

\W

숫자,문자,밑줄이 아닌 모든것

\x

16진수 숫자와 일치

\0

8진수 숫자와 일치

\s

모든 공백문자 (개행문자, 탭 등과 일치 )

\S

공백문자가 아닌 모든 것과 일치

\n

줄바꿈

\r

캐리지 리턴

위치 지정

^

문자열의 시작과 일치

\A

문자열의 시작과 일치

$

문자열의 끝과 일치

\<

단어의 시작과 일치

\>

단어의 끝과 일치

\b

단어 경계와 일치

\B

단어 경계가 아닌 것과 일치


Numpy 와 Pandas에서 불리언 색인의 활용

Numpy  불리언 색인 기능 소개.


정규 python의 리스트 중첩과 유사하나 보다 쉽게 if 문의 활용 및 다양한 데이터 가공을 가능하게 함.


정규 python의 리스트 중첩은 아래와 같다.


array1 = [1,2,3,4,5]

#이를 리스트 중첩으로 3보다 큰 리스트를 추출할 수 있다.

[x for x in array1 if x > 3]

Out[39]: [4, 5] 


Numpy 에서는 보다 쉽게 array 를 추출 가능.


import numpy as np

array2 = np.array([1,2,3,4,5])

# numpy array 에서 비교 연산자를 바로 적용 시 각 array 값 별로 True , False 값을 반환.

array2 > 3

Out[44]: array([False, False, False,  True,  True], dtype=bool)

# 1차원 배열에서 3보다 큰 값을 모두 추출함.

array2[array2 > 3]

# True에 해당하는 index array 값만 반환. 

Out[45]: array([4, 5])


불리언 색인은 array의 색인이 True, False 값을 가지게 하여 True 인 경우에 해당 array 값을 출력하게 함.



다음 예제는 Python for Data Analysis 에서 가져온 것이다.

2차원 Numpy 배열에 불리언 색인을 적용한 예제다.


names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])

names

Out[48]:

array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],

      dtype='<U4')

data = np.random.randn(7,4)

data

Out[50]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [-1.18357656,  1.61485173, -0.93498466,  0.62553805],

       [-0.35840121, -0.2164986 , -0.59688896, -0.49594989],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842],

       [ 0.04366381, -0.57763389,  0.16284361, -0.46842905],

       [-0.13914101, -1.09840424,  0.16332229,  0.21295691],

       [ 0.61643143, -1.94844699,  0.18180573, -0.8689196 ]])




비교 연산자 == anames array 에 바로 적용할 때 True,False 값이 각 array 값에 설정되며 이를 불리언 색인으로 사용할 수 있다.  array[0] array[3] 만이 True 이다

names == 'Bob'

Out[51]: array([ True, False, False,  True, False, False, False], dtype=bool)



2차원 배열인 data에 바로 불리언 색인을 적용할 수 있다. Array[0]array[3] True 이므로 data 배열에서 1행과 4행만을 출력한다.

data[names=='Bob']

Out[52]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842]])


출력하려는 행렬을 슬라이스나 숫자 색인을 줘서 제한 할 수 있다. 위의 경우는 불리언 색인으로 추출된 배열에서 2: 3열 이후의 값을 추출함.

data[names=='Bob',2:]

Out[55]:

array([[ 1.87164573,  0.66950956],

       [-1.1023612 ,  0.55036842]])


논리연산자를 이용하여 보다 복잡한 조합도 가능하다.

& (And) , | (Or) 논리 연산자를 이용한 불리언 색인 결과

(names == 'Bob') | (names =='Will')

Out[65]: array([ True, False,  True,  True,  True, False, False], dtype=bool)

data[ (names=='Bob') | (names == 'Will') ]

Out[61]:

array([[-1.26013079,  0.29081568,  1.87164573,  0.66950956],

       [-0.35840121, -0.2164986 , -0.59688896, -0.49594989],

       [ 0.88574796, -0.28987652, -1.1023612 ,  0.55036842],

       [ 0.04366381, -0.57763389,  0.16284361, -0.46842905]])


불리언 색인에 기반한 값 대입도 가능하다.

data < 0

Out[66]:

array([[ True, False, False, False],

       [ True, False,  True, False],

       [ True,  True,  True,  True],

       [False,  True,  True, False],

       [False,  True, False,  True],

       [ True,  True, False, False],

       [False,  True, False,  True]], dtype=bool)



# 값 대입

data[data < 0 ] = 0

data

Out[68]:

array([[ 0.        ,  0.29081568,  1.87164573,  0.66950956],

       [ 0.        ,  1.61485173,  0.        ,  0.62553805],

       [ 0.        ,  0.        ,  0.        ,  0.        ],

       [ 0.88574796,  0.        ,  0.        ,  0.55036842],

       [ 0.04366381,  0.        ,  0.16284361,  0.        ],

       [ 0.        ,  0.        ,  0.16332229,  0.21295691],

       [ 0.61643143,  0.        ,  0.18180573,  0.        ]])




다음은 Pandas 에서 이러한 불리언 색인에 기반한 호출을 수행해보자


비교연산자 >= pandas DataFrameValueTrue, False 값이 인덱스별로 설정됨.


df = pd.DataFrame(

{

'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]

}

)

df

Out[82]:

   AAA  BBB  CCC

0    4   10  100

1    5   20   50

2    6   30  -30

3    7   40  -50



df.AAA >=5

Out[74]:

0    False

1     True

2     True

3     True

Name: AAA, dtype: bool



AAA 필드가 5보다 크거나 같은 인덱스의 값만이 출력됨.  

df[df.AAA >=5]

Out[73]:

   AAA  BBB  CCC

1    5   20   50

2    6   30  -30

3    7   40  -50




ix 함수를 사용하면 더욱 다양한 활용이 가능하다.

Ix 를 이용하여 원하는 필드만 추출 가능하다. 위 예제 에서는 AAA BBB 컬럼만을 추출하였다.

물론 동일한 결과를 아래의 Slicing 을 통해서도 얻을 수 있다.

df.ix[df.AAA >=5]

Out[72]:

   AAA  BBB  CCC

1    5   20   50

2    6   30  -30

3    7   40  -50

df.ix[df.AAA >=5 ,['AAA','BBB']]

Out[78]:

   AAA  BBB

1    5   20

2    6   30

3    7   40

df.ix[df.AAA >=5, :2]

Out[79]:

   AAA  BBB

1    5   20

2    6   30

3    7   40




데이터의 입력도 가능하다.
AAA 컬럼값이 5 이상인 레코드를 대상으로 BBB 컬럼을 -1 로 새롭게 입력하였다.


df.ix[df.AAA >=5,'BBB'] = -1

df

Out[84]:

   AAA  BBB  CCC

0    4   10  100

1    5   -1   50

2    6   -1  -30

3    7   -1  -50





Pandaswhere 함수를 사용하면 기존 값의 가공에 따라 데이터를 새로운 컬럼값으로 입력할 수 있다.

In [7]: df = pd.DataFrame( ...: {'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})

df ...: Out[7]:

AAA BBB CCC

0 4 10 100

1 5 20 50

2 6 30 -30

3 7 40 -50

In [8]: df['logic'] = np.where(df['AAA'] > 5,'high','low')

df

Out[8]:

AAA BBB CCC logic

0 4 10 100 low

1 5 20 50 low

2 6 30 -30 high

3 7 40 -50 high



With as 절이 도입되기 이전에는 File i/o 처리를 위해 다음과 같이 fileopen 하고 close 하는 routine 을 수행해줘야 한다.

f= open(“ 파일명”, “r+”)

Line = f.readline()

f.close()


특히 file I/O시 오류발생에 대응하기 위해서 file open close 시에 try : except : finally: 절을 이용하여 I/O 에러 처리 및 close 처리를 해줘야 한다.

f=None

Try :

  f= open(“파일명”,”r+”)

                           line = f.readline()

Except:

  pass

Finally:

  f.close()


그러나 with .. As 절을 이용하면 try , except,finally 를 이용하지 않고도 자동으로 file close 해줄 수 있다.

With open(“파일명”,”r+”) as f

  f.readline()

개요


항목

설명

내용 및 특징

Memory mapped File File I/O Virtual Memory 처리 기반에서 수행할 수 있게 해준다.


Memory API를 이용하여 File I/O Api를 대신할 수 있으므로 보다 쉬운 API 사용이 가능.

장점

File Buffer 를 거치지 않고 Memory에서 I/O Direct access 하고, 4K 단위의 Memory page

이용하므로 I/O 성능을 개선


여러 프로세스끼리 공유파일이 가능.

단점

32bit 시스템에서 4G 이상의 파일은 수용할 수 없음.

처리해야 할 에러 유형이 상대적으로 많음.


주요 특징

Memory mapped filefile object , string object 둘 다를 지원하는 다양한 api 를 가지고 있다. Close(),flush(),read(),readline(),seek(),tell(), write() 와 같은 file api slicing 이나 find와 같은 string api 도 지원함.

Mmap.mmap() 함수로 반환된 object 에 대해서 리스트연산, slicing 등 기존 문자열 처리에 사용되는 api 를 이용하여 다양하게 가공이 가능하다.


API 설명


UnixWindow 간 함수 인자값에 차이가 있으므로 주의가 필요하다. 
class mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])  로 호출된다.
Filenoopen(파일명) 으로 반환된 File descriptor ,
length 는 메모리로 매핑할 파일의 크기, 0 으로 설정 시 파일 전체를 메모리로 매핑
Flags 는 메모리매핑의 공유 특성을 나타냄. MAP_SHARED 가 디폴트이며 이 경우 다른 프로세스가 해당 파일 매핑을 변경할 시 다른 프로세스도 이를 공유할 수 있다. MAP_PRIVATE 는 프로세스별로 별도의 COPY_ON_WRITE 공간을 가지므로 개별 프로세스의 파일 매핑 변경사항이 공유되지 않는다.
Access  ACCESS_READ, ACCESS_WRITE, or ACCESS_COPY 로 읽기, 쓰기 , 복사용도를 나타냄.  ACCESS_COPY 의 경우는 변경사항을 메모리에만 적용하고 파일에는 적용하지 않는다.
Prot 는 메모리 protection 을 나타내며, PROT_READ and PROT_WRITE 가 사용됨.  디폴트는 PROT_READ | PROT_WRITE 이며 해당 메모로기 read 또는 write 로 사용 될 수 있음을 의미함.



연산을 수행하다보면, 동적으로 할당된 array 에 대해서 몇행, 몇열 행렬로 구성되었는지 알아야 할 경우가 있다. 
이 경우 array의 shape 를 이용하여 간단하게 알 수 있다.  


a = np.array( [ [
1,2,3],[4,5,6],[7,8,9],[10,11,12] ])
# a 는 3 x 3 행렬로 구성됨.

print(a.shape)


print 결과는 (4,3 ) 임.


추가로 shape[0], shape[1]를 이용하여 전체 행의 갯수와 열의 갯수를 반환받을 수 있다.

즉 a.shape[0] 결과는 4임(shape 튜플의 첫번째 요소는 4) , a.shape[1]의 결과는 3임(shape 튜플의 두번째 요소는 3).


1. ASMM 정의 

10g 부터 SGA 구성 요소 ( Buffer Pool , Shared Pool , Large Pool , Java Pool) 메모리를 동적으로 조정가능할 수 있게되었으며 이를 ASMM 기능이라 한다. 
원래 Buffer Cache는 db_cache_size , Shared Pool 은 shared_pool_size , Large Pool은 large_pool_size 파라미터를 통해 변경되며 이들 파라미터를 변경하면 Oracle Instance는 재 기동이 되어야 함. 
ASMM은 재 기동없이 이들 메모리 값을 동적으로 변경가능하게 한다.  이를 위해 SGA_TARGET , SGA_MAX_TARGET 이라는 신 파라미터가 도입됨. 

2. ASMM 파라미터 할당
SGA_TARGET은 동적으로 조정될 수 있는 SGA값이며 , SGA_MAX_SIZE는 SGA가 최대로 할당 될 수 있는 값임.
만일 SGA_TARGET=250M , SGA_MAX_SIZE=400M 라면 SGA는 최소 250M부터 할당되어 최대 400M 까지 설정 가능함. 

SGA_TARGET의 경우 운영중 동적으로 변경가능하나 SGA_MAX_SIZE는 운영중 그 값을 변경할 수 없음. 

SGA_TARGET은 ALTER SYSTEM SET SGA_TARGET=400M SCOPE=BOTH 로  SPFILE 과 MEMORY에 동시 적용 가능.
그러나 SGA_MAX_SIZE 는 ALTER SYSTEM SET SGA_MAX_SIZE=500M SCOPE=SPFILE 로 SPFILE 파일에만 변경 적용 가능하며 운영중에는 변경이 불가능함. 

SGA_TARGET은 SGA_MAX_SIZE보다 커질 수 없기때문에 이와 같이 파라미터를  설정할 경우 DB는 기동되지 않음. pfile 을 통해 파라미터를  SGA_TARGET 값을 SGA_MAX_SIZE보다 작게 설정한 후 STARTUP PFILE로 기동 필요. 

SGA_TARGET을 특정값으로 설정하고 DB_CACHE_SIZE,SHARED_POOL_SIZE가 0 으로 설정하면 DB에서 자동으로 이들을 최적화된 값으로 재 설정해 줌.  DB_CACHE_SIZE등의 값이 미리 설정되어 있다면 DB는 최소한 설정된 해당 값이상으로 메모리를 할당함.

만일 DB_CACHE_SIZE + SHARED_POOL_SIZE + LARGE_POOL_SIZE + JAVA_POOL_SIZE 가 SGA_TARGET 또는 SGA_MAX_SIZE보다 크다면 ASMM 값을 무시하고 설정된 DB_CACHE_SIZE , SHARED_POOL_SIZE , LARGE_POOL_SIZE , JAVA_POOL_SIZE 값으로 메모리를 할당함. 

3. AMM 
11g 부터는 기존 SGA메모리 뿐만 아니라 서버 프로세스의 메모리도 동적으로 조정가능할 수 있게 함. 즉 PGA_AGGREGATE_TARGET 까지 합산된 총 메모리 조정. 

이를 위해 MEMORY_TARGET 과 MEMORY_MAX_TARGET 파라미터가 도입됨. 

4. AMM 파라미터 할당 
ASMM과 유사하게 MEMORY_TARGET은 동적으로 조정될 수 있는 메모리 값이며 , MEMORY_MAX_TARGET은 동적으로 최대 할당될 수 있는 메모리 값임.  MEMORY_TARGET=400M , MEMORY_MAX_TARGET=500M로 설정하면 SGA+PGA는 최소 400M에서 최대 500M 까지 변경 가능. 

ASMM과 마찬가지로 MEMORY_TARGET은 운영중 동적으로 변경 가능하나 MEMORY_MAX_TARGET은 운영중 그 값을 변경할 수 없으며 MEMORY_TARGET은 MEMORY_MAX_TARGET보다 반드시 같거나 작아야 함.  만일 MEMORY_TARGET 파라미터를 설정하지 않고 MEMORY_MAX_TARGET 값만 설정할 경우 MEMORY_TARGET은 MEMORY_MAX_TARGET 값과 동일하게 설정됨. 

AMM을 적용할 경우 SGA_TARGET 및 PGA_AGGREGATE_TARGET을 0으로 설정하며 DB가 자동으로 SGA 및 PGA메모리를 할당함. 만일 SGA_TARGET 또는 DB_CACHE_SIZE,SHARED_POOL 등의 파라미터가 설정되어 있으며 대신 이들 파라미터 설정값을 메모리로 할당함. 

SGA_MAX_SIZE + PGA_AGGREGATE_TARGET 이 MEMORY_MAX_SIZE 보다 클 경우 AMM은 무시하고 설정된 SGA_MAX_SIZE, PGA_AGGREGATE_TARGET 값을 사용함. 

+ Recent posts