2012-07-11 3 views
1

필자는 저에게 맞는 시스템을 만들었지 만이 프로그램만으로 많은 CPU 부하를 차지하기 때문에 최적화해야합니다.gnuplot을 사용하여 휘발성 데이터 파일을 동적으로 플로팅

여기 정확히 문제가 있습니다.

나는 실시간으로 플롯해야하는 입력 신호/데이터 스트림이 있습니다. 한 번에 표시 할 수있는 제한된 수의 점만 (1024 포인트라고 말하기) 때문에 x 축에서 0-1024의 인덱스에 대해 y 축을 따라 데이터 포인트를 그립니다. 들어오는 데이터 값의 범위는 0-1023입니다.

내가 현재하고있는 것은 (이것은 모두 C++로되어있다.) 나는 순환 루프에 데이터를 넣었고 데이터가 업데이트 될 때마다 (또는 모든 두 번째/세 번째 데이터 포인트) 파일에 쓸 때마다 파이프를 사용하여 gnuplot을 사용하여 해당 파일의 데이터를 플롯합니다.

이것은 거의 완벽하게 작동하지만로드가 상당히 많이 발생합니다 (입력 데이터 속도에 따라 Core 2 Duo의 두 코어에서 70 %의 사용률을 보았습니다). 이 짧은 프로그램과 함께 일부 프로세서 집약적 인 코드를 실행해야하므로 최적화가 거의 필요하다고 생각합니다.

내가 할 수있는 일은 다음과 같습니다. 현재 플롯과 새 데이터의 차이점 만 그릴 수 있습니까? (또는 전체 그래프를 다시 채우지 않고 각 점을 그려서 그 x 색인이 제거됨).

그래프에 고정 된 수의 점이있어서 replot이 작동하지 않습니다. 그 x 위치에있는 오래된 점을 제거하고 싶습니다.

+0

gnuplot을 호출하기 위해 시스템 호출을하고 있습니까? gnuplot의 출력은 어디에 있습니까? 그래픽 파일에? – Mark

+0

Downvoter : 정확히 ** ** 왜 ** downvoted를 언급하는 코멘트를 남겨주세요. 의견을 제공하지 않으면 사람들은 어떻게 학습해야합니까? – mgilson

+0

@ 마크 - 아마도 일부 터미널 (아마도 x11 또는 wxt)으로갑니다. – mgilson

답변

1

불행히도 성취하고자하는 것은 할 수 없습니다. 데이터 파일을 volatile으로 표시하거나 refresh 키워드를 사용할 수 있지만 데이터를 다시 읽지 않고도 플롯 만 업데이트됩니다. 데이터를 다시 읽은 다음 차이점 만 업데이트하려고합니다.

도움이 될만한 몇 가지 사항이 있습니다. 1) 눈은 ~ 초당 26 프레임 만 등록 할 수 있습니다. 따라서 gnuplot에 초당 26x의 데이터 만 전송하도록하는 방법이 있다면 도움이 될 것입니다. 2) 어떻게 데이터 파일을 작성하고 있습니까? 아스키 또는 바이너리로 버려지고 있습니까? 바이너리 덤프를 수행하는 것이 더 빠를 수도 있습니다 (쓰기 및 gnuplot 읽기 모두). 실험을해야합니다.

...이 아마 스크립트가 더 빨리 갈 수 있도록하지 않습니다 하나 해킹이지만, (당신이 합리적인 yrange 설정을 알고, 데이터를 플롯 포인트를 사용하는 경우) 당신은 그것을 시도 할 수

#set up code: 
set style line 1 lc rgb "blue" 
set xrange [0:1023] 
set yrange [0:1] 
plot NaN notitle #Only need to do this once. 
for [i=0:1023] set label i+1 at i,0 point ls 1 #Labels must have tags > 0 :-(

#this part gets repeated by your C code. 
#you could move a few points at a time to make it more responsive. 
set label 401 at 400,0.8    #move point number 400 to a different y value 
refresh        #show it at it's new location. 
+0

현재, 아스키로 데이터를 버리고 있습니다. 명령에서 직접 데이터를 파이핑하는 방법에 대해 생각했지만 차이가 없다고 생각했습니다. 제한된 y 범위에 고정 된 데이터 세트가 있기 때문에이 해킹이 효과가있는 것처럼 보입니다. 나는 저녁에 그것을 시도하고 다시 당신에게 돌아갈거야. 감사합니다 – Ajay

+0

이것은 작동하지 않았다. 사실, 실제로 느리게 만들었습니다. 그러면 데이터가 gnuplot으로 빠르게 파이프됩니다. 작의는 매우 느리고 (이전 버전과 비교하여) 실시간이 아니 었습니다. pipe 문과 함께 printf 문을 발행했습니다. 나는 printf가 그 줄거리를 거의 랩핑하고있는 것을 보았고, 그 후 2 초 내에 세그먼테이션 결함이 생겼다. (아마도 파이프가 데이터로 넘치기 때문일 것이다. 이것이 의미하는 바는 리프레시가 전체 점 집합을 복제하고 느린 것을 생각한다. 데이터 파일에서 직접 플로팅 – Ajay

+0

두 가지 방법을 사용하여 매 5 번째/10 번째 점만 다시 채 웁니다. 원래 방법으로 건너 뛰는 것을 알 수는 없습니다. – Ajay

1

reread 함수를 사용하여 gnuplot을 사용하여 FAQ에서 설명한대로 데이터의 동적 플로팅을 수행 할 수 있습니다. 꽤 낮은 부하에서 실행되는 것처럼 보이고 끝까지 도달하면 자동으로 그래프를 스크롤합니다. 낮은 부하에서 실행하려면 awk 명령 뒤에 ; sleep 1을 추가해야한다는 것을 알았습니다 (예제 파일 dyn-ping-loop.gp에서). 그렇지 않으면 awk 처리시 루프에 너무 많은 CPU를 소비합니다.

+0

다음은 다시 읽기 기능을 설명하는 Q & A입니다. ion : https://stackoverflow.com/questions/44470965/how-can-you-watch-gnuplot-realtime-data-plots-as-a-live-graph-with-automatic-up- no awk; 모두 gnuplot에서 완료되었습니다. 일시 중지 및 다시 읽음을 사용하여 거의 실시간으로 움직이는 애니메이션 그래프를 생성합니다. – SDsolar

관련 문제