언어 - 디버깅 및 병목 현상을 발견하는 기술

소개



R에 한정된 이야기는 아니지만, 프로그래밍에서는, 변수에 의도한 값이 격납되어 있는 것을 확인하거나, 함부로 시간이 걸리는 프로그래밍이 되어 있지 않은지를 확인하는 일이 있습니다. R에는 디버깅과 병목 현상을 찾는 기술도 있습니다.

browser 함수를 사용한 디버깅 기법



함수 내에서 디버깅을 활성화하려면 browser() 함수를 사용합니다. 다음의 예는, 인수로 주어진 수치에 대해서, 화차적상을 계산하는 유저 함수에, browser() 함수를 사용한 샘플 스크립트입니다. 디버그 실행의 개시 조건으로서, 「첫 번째의 인수가 8 이상」이라고 하는 것을 browser() 함수에 지정하고 있습니다.

함수 만들기



▼ 샘플 스크립트

R
func_calc <- function(x,y){
+ a <- x
+ b <- y
+ browser(expr = x <= 8)
+ print("和")
+ print(sum(a,b))
+ print("差")
+ print(a - b)
+ print("積")
+ print(a * b)
+ print("商")
+ print(a / b)
+ }

디버깅 실행



▼ 샘플 스크립트

R
# 変数xが8以上を指定してデバッグを開始します
func_calc(8,2)

▼실행 결과 예

실행 결과 예
Called from: func_calc(8, 2)
Browse[1]> a       # 変数aを確認します
[1] 8
Browse[1]> b       # 変数bを確認します
[1] 2
Browse[1]> n       # 次のコードに進みます
debug at #5: print("和")
Browse[2]> n       # 次のコードに進みます
[1] "和"
debug at #6: print(sum(a, b))
Browse[2]> n       # 次のコードに進みます
[1] 10

디버깅을 계속 실행



▼실행 결과 예

실행 결과 예
Browse[2]> c      # 以降の全てのステップを実行します
[1] "差"
[1] 6
[1] "積"
[1] 16
[1] "商"
[1] 4
[1] "平均値"
[1] 5
[1] "中央値"
[1] 5
[1] "分散値"
[1] 18

browser 함수의 명령은 다음과 같습니다.
명령 설명
N 다음 단계 수행
C 이후의 모든 단계 수행
where 스택 출력
Q browser() 함수 종료

Rprof 함수를 사용하여 병목 현상을 찾는 방법



R의 명령 실행 시간 프로파일을 활성화/비활성화하려면 Rprof () 함수를 사용하십시오. 코드의 각 실행 단위의 사용 횟수를 일정한 샘플링 간격마다 확인하고 보고합니다. 프로필의 요약 표시는 summaryRprof() 함수에서 참조합니다. 다음 예제는 Rprof 함수에서 Oracle R Enterprise 패키지로드 → Database에 연결 → gc () 실행 → sys.rq_config 테이블 찾아보기 → gc () 실행의 프로파일을 검색하는 샘플 스크립트입니다. library() 함수로 읽어들이는 패키지는, install.packages() 함수등으로 사전에 인스톨이 필요합니다. . Oracle R Enterprise (이하 ORE)를 사용하려면 Oracle Database Enterprise Edition 옵션 인 Oracle Advanced Analytics가 필요합니다. 다음 샘플 스크립트는 Rprof() 함수로 프로파일을 시작합니다.

▼ 샘플 스크립트

R
# プロファイルを開始します
Rprof( filename = "Rprof.out", append = FALSE, interval = 0.02, memory.profiling = TRUE )
# ライブラリパスを指定します 
.libPaths("<パッケージ格納先のパスを指定>")
# データベースに接続するため、パッケージ「ORE(注1)」を読み込みます
library( ORE )
# データベースへ接続します
ore.connect( user = "ruser", sid = "orcl", host = "localhost",
password = "ruser", port = 1521, all = TRUE )
# gc()関数を実行します
gc( reset = TRUE )
# SYS.RQ_CONFIG表を参照します
getMemorySettings <- function() {
  con <- dbConnect(Extproc())
  rs <- dbSendQuery( con, "SELECT NAME, VALUE FROM SYS.RQ_CONFIG" )
  dat <- fetch( rs )
  dat
}
ore.doEval( getMemorySettings, ore.connect = TRUE )
# gc()関数を再実行します
gc()
# プロファイルを終了します
Rprof( NULL )

▼ 샘플 스크립트
다음 샘플 스크립트는 프로파일 결과의 요약을 표시합니다.

R
# メモリ使用量と実行時間を含めてサマリを表示します
summaryRprof( filename = "Rprof.out", memory = "both" )

▼실행 결과 예

summaryRprof() 함수의 memory 옵션에는 다음과 같은 매개 변수가 있습니다.
옵션 설명
none 메모리 정보가 표시되지 않음
stats 메모리 정보 통계 보기
tseries 시계열에서 메모리 정보 표시
both 메모리 사용량과 실행 시간 표시

참고



OS strace 명령도 강력한 도구
OS의 strace 명령을 사용하면 시스템 호출마다 걸린 시간을 출력할 수 있습니다. 이 섹션에서는 strace 명령을 사용하여 병목 현상을 조사하는 방법을 소개합니다. Tips에서 소개한 Rprof() 함수와 함께 사용하면 효율적으로 병목 현상을 확인할 수 있습니다.

▼실행예

실행 예
# 1. プロセス番号を調べる
> ps -ef | grep R
oracle    3588  3558  6 19:10 pts/3    00:00:00 /usr/lib64/R/bin/exec/R
# 2. strace を root ユーザで実行(-c で時間統計を出力)
> strace -p 3588 -c
# 3. 処理を実行
> gc(reset=TRUE)
         used (Mb) gc trigger   (Mb) max used (Mb)
Ncells 170235  9.1     350000   18.7   170235  9.1
Vcells 270347  2.1  840423198 6412.0   270347  2.1
>
# 4. strace を終了(ctrl+c)させて、結果を出力

▼실행 결과 예


주석



참고 1 샘플 스크립트는 Oracle R Enterprise 1.3.1을 사용합니다.

좋은 웹페이지 즐겨찾기