2012-07-11 101 views
1

我已經看到了一些類似的問題,我製作了一個適用於我的系統,但我需要優化它,因爲這個程序本身佔用了大量的CPU負載。用gnuplot動態繪製一個易變的數據文件

確切地說,這是問題。

我有一個輸入信號/數據流,我需要實時繪圖。我只想要一次顯示有限數量的點(說1024個點),因此我繪製了沿x軸的數據點與x軸上0-1024的索引。傳入數據的值範圍爲0-1023。我現在所做的(這全部是在C++中)是我把數據放到一個循環中,每當數據被更新時(或者每第二/第三個數據點),我就寫出一個文件並使用管道,我用gnuplot繪製該文件中的數據。

雖然這個工作幾乎完美,但它會導致一定的負載(根據輸入數據速率,我在Core 2 Duo的兩個內核上看到的使用率甚至達到70%)。我需要運行一些處理器密集型代碼以及這個簡短的程序,所以我覺得幾乎有必要優化它。

我希望能做的事情是這樣的:我只能繪製當前繪圖和新數據之間的差異(或繪製每個點的圖形,而不重新繪製整個圖形,以便舊的項目在該x索引被刪除)。

我在圖上有固定數量的點,所以replot不起作用。我想要刪除那個x位置的舊點。

+0

您正在進行系統調用來調用gnuplot? gnuplot的輸出到哪裏去?進入圖形文件? – Mark 2012-07-11 18:28:16

+0

Downvoter:請發表評論,說明完全**爲什麼**你downvoted。如果你不提供反饋,人們應該如何學習? – mgilson 2012-07-12 01:36:21

+0

@Mark - 推測它會進入一些終端(可能是x11或wxt)。 – mgilson 2012-07-12 01:36:55

回答

1

不幸的是,你試圖完成的事情是無法完成的。您可以將數據文件標記爲volatile或使用refresh關鍵字,但這些關鍵字只會更新繪圖而不重新讀取數據。您想重新讀取數據,然後只更新差異。

雖然有一些可能有用的東西。 1)你的眼睛只能登錄〜每秒26幀。所以,如果你有辦法確保你只發送每秒26x的數據給gnuplot,那可能會有幫助。 2)你如何編寫數據文件?你傾向於ascii還是二進制?做二進制轉儲可能會更快(無論是寫入和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

目前,我傾銷的數據ascii。我想直接在命令中輸入數據,但我覺得它沒有任何區別。 這種黑客看起來可能會起作用,因爲我確實在有限的y範圍內有一組固定的數據點。我會在晚上嘗試它並回復你。謝謝 – Ajay 2012-07-12 05:30:39

+0

這沒有奏效。事實上,它實際上變慢了。會發生什麼呢?數據以最快的速度傳輸到gnuplot。繪圖非常緩慢(與早期版本相比)並不是實時的。我和管道聲明一起發佈了printf聲明。我看到printf幾乎是在研究這個圖,幾秒之後,它給出了一個分段錯誤(很可能是因爲管道溢出了數據,我認爲這意味着刷新重新繪製了整個點集,並且它比直接從數據文件中繪製 – Ajay 2012-07-12 17:14:19

+0

使用這兩種方法,我只重新繪製每五分之一/十分的點,用原始的方法,你不能說它跳過了。 – Ajay 2012-07-12 17:18:15

1

您可以使用gnuplot按照FAQ中的說明使用reread函數對數據進行動態繪圖。它似乎以相當低的負載運行,並在達到最後時自動滾動圖形。要在低負載下運行,我發現我必須在awk命令之後添加一個; sleep 1(在他們的示例文件dyn-ping-loop.gp中),否則在循環awk處理時花費太多的CPU。

+0

這裏是一個問答解釋重讀函數離子: https://stackoverflow.com/questions/44470965/how-can-you-watch-gnuplot-realtime-data-plots-as-a-live-graph-with-automatic-up - 沒有awk;全部在gnuplot中完成。使用暫停和重新讀取的近實時現場動畫圖形。 – SDsolar 2017-06-10 18:46:38