0

ggpairs()은 조부모 인 scatterplotMatrix()과 마찬가지로 쌍 수가 늘어남에 따라 속도가 매우 느립니다. 공정 해; 쌍들의 순열의 수는 요인에 따라 증가한다.매트릭스 플롯을 가속하는 방법이 있습니까?

내 머신의 다른 코어가 유휴 상태에있는 것을보아야한다는 것은 불만족 스럽습니다.

큰 매트릭스 플롯을 병렬 처리하는 방법이 있습니까?

다음은 벤치마킹을위한 샘플 데이터입니다. print() 문을 제외한

num.vars <- 100 
num.rows <- 50000 
require(GGally) 
require(data.table) 

tmp <- data.table(replicate(num.vars, runif(num.rows)), 
        class = as.factor(sample(0:1,size=num.rows, replace=TRUE))) 

system.time({ 

    tmp.plot <- ggpairs(data=tmp, diag=list(continuous="density"), columns=1:num.vars, 
         colour="class", axisLabels="show") 
    print(tmp.plot)}) 

흥미롭게도, 내 초기 벤치 마크 허용 속도 (위의 21 분)에 달렸다. 추가 된 print 문은 내 컴퓨터에서 segfaults로 보이는 것을 발생 시켰습니다. (R 세션이 OS에 의해 간단하게 종료되기 때문에 지금은 말하기가 어렵습니다.)

메모리에 문제가 있습니까? 아니면 병렬 처리 할 수있는 것이 있습니까? (적어도 플롯 생성 부분은 병렬 의무가 보인다.) GGally:::print.ggpairs 내 작품의 대부분은 (당신이 라인을 계산하는 방법에 따라, 어딘가에 라인 (50)의 주위에) 두 개의 for 루프 내부에서 발생하기 때문에 ggpairs 플롯을 그리기

+2

결과 플롯이 의미있는 것으로 생각 했습니까? 또한, 이런 식으로'replicate'을 사용해서는 안됩니다 (이것은 R 루프입니다). 'matrix (runif (num.vars * num.rows), ncol = num.vars)'와 같은 것을 사용하십시오. '인쇄'는 실제 그리기 (즉, 그래픽 오브젝트의 평가/렌더링)를 야기하는데, 이는 그렇지 않은 경우 그리드 그래픽을위한 기능들 내에서 수행되지 않는다. – Roland

+0

웁스! 당신 말이 맞아요, 복제는 벤치 마크에 있지 않아야합니다. 작업을 해체하기 위해 특별히'print' 문을 추가했지만, 내가 묻는 방식이 명확하지 않습니까? (결과 플롯은 적절하게 스케일 된 경우 합리적인 것입니다.) 이런 종류의 간단한 청킹 함수가 좋을지라도 - 어딘가에 재 작성이 필요한 곳이 있습니다.) –

+1

병렬 처리가 약간 도움이 될 수 있지만 원하는 경우 심각한 개선이라면 더 열심히 일하지 않고 더 똑똑하게 일하는 더 좋은 방법 일 수 있습니다. 나는 해결책을 줄 수는 없지만 아마도 [이 MATLAB 솔루션] (http://www.mathworks.nl/matlabcentral/fileexchange/40790-plot-big)이 영감의 원천이 될 수 있습니다. –

답변

4

는 단일 스레드입니다 : .parallel 인수를 가지고

for (rowPos in 1:numCol) { 
    for (columnPos in 1:numCol) { 

plyr::l_ply (또는 유사)에 대한 호출과 함께 이들을 대체하는 것이 가능할 수있다. 그래픽 장치가 여러 개의 코어를 동시에 처리하려고 할 지에 대해서는 잘 모르겠다. 필자의 직감은 평행 한 플로팅을 강력하게 작동시키는 것이 중요하지 않을 수도 있지만 재미있는 프로젝트가 될 수도 있습니다.

+0

글쎄, 하나의 간단한 생각은 병렬 'foreach'를 사용하고 적어도 어떤 일이 일어나는지를보아야한다. –

+1

@TrevorAlexander 예,'plyr' 함수에 대한'.parallel' argument는'foreach'를 호출합니다. –

관련 문제