2012-02-06 21 views
5

Próbuję znaleźć narzędzie do drukowania danych (głównie wykresów liniowych i podobnych), które mogą być używane w aplikacjach o wysokiej wydajności. Moje okno danych zwykle zawiera od 500 do kilku tysięcy punktów, a ja byłbym szczęśliwy z liczbą klatek na sekundę wynoszącą około 10. Otrzymuję moje dane jako strumień binarny na gnieździe. Jestem na Mac OS X.Wyświetlanie danych w czasie rzeczywistym o wysokiej wydajności

Próbowałem już kilku rozwiązań i poniżej omawiam z nimi moje doświadczenia.

R: strasznie powolny i nie może nadążyć, bolesne czytać gniazd, migotanie wykresie.

matplotlib: Bardzo powolny, ale trochę użyteczny, również. Wymaga to jednak mnóstwa maszyn Pythona do uruchomienia, a IMO API jest dość nieprzejrzysty. Podczas ciągłej aktualizacji okno zawierające wykres staje się modalne i pojawia się piłka plażowa Mac - nie jest to świetne miejsce do interakcji z użytkownikiem.

Gnuplot: Znacznie lepsza wydajność i interfejs API. Jednak przesyłanie dużych ilości danych do gnuplot odbywa się poprzez generowanie tymczasowych plików ASCII (!) - oznacza to, że jeśli moja liczba klatek na sekundę wzrośnie, zaczynam robić tony odczytów dysku i jest to problem z wydajnością.

Jakieś inne sugestie?

+0

Twoje pytanie wydaje się podobny do kopalni: http://stackoverflow.com/questions/8946474/is-it-possible-to-speed-up-matlab-plotting-by-calling-cc-code-in-matlab – memyself

+0

Nie jestem pewien, czy możesz to zrobić poza C++ lub innym językiem, ale zapobiegam migotaniu poprzez malowanie na bitmapie pamięci, a następnie blaknięcie jej na ekranie. Jest to w rzeczywistości szybsze, ponieważ nie przycina się do nakładających się prostokątów podczas malowania. Ponadto, dla użytkownika wygląda szybko, nawet jeśli tak nie jest. –

+0

@MikeDunlavey Dzięki - ale jakich technologii używasz do tworzenia i malowania. – Jake

Odpowiedz

4

Spróbuj użyć gnuplot przy użyciu danych potokowych zamiast plików tymczasowych. Przykładowe zastosowania:

plot "data_acquisition_cmd <" with image 

można przepuścić w nieskończonej strumienia replots czytając polecenia z rury, a także:

load "while [ 1 ]; do echo 'replot'; done <" 

Dla bardziej niezawodne rozwiązanie, za pomocą interfejsu do gnuplot z Perl jak GnuplotIF lub Python (gnuplot.py), ponieważ umożliwiają one zarówno programową kontrolę gnuplot, jak i możliwość przekazywania danych bezpośrednio do niego.

Edit: Dzięki Jonhoo do korekcji składni

+0

Dla tych, którzy próbują tego i dostają grono błędów, zamieńcie końcowe | z wiodącym <, i wszystko powinno działać poprawnie –

+0

@ Jonhoo: czy jest to rzecz specyficzna dla platformy, czy powinienem zmodyfikować odpowiedź? –

+0

Z tego co wiem z [dokumentacji gnuplot] (http://gnuplot.info/docs_4.6/gnuplot.pdf), '<' jest jedynym akceptowanym sposobem przesyłania danych z zewnętrznego skryptu do gnuplot zarówno dla danych (p83) i dla 'obciążenia' (p71). '|' jest używane tylko, afaict, dla operacji wyjściowych, w których chcesz gdzieś umieścić potok gnuplot ('save',' print' lub 'output'). –

0

Biblioteka Qwt ma możliwość drukowania danych w czasie rzeczywistym. W drzewie źródłowym znajduje się nawet kilka przykładów, które zapewniają różne sposoby kreślenia w czasie rzeczywistym. Warto zwrócić uwagę na przykłady oscyloskopów, odświeżających i realistycznych.

Dodatkowo istnieje lista recent discussion na liście mailingowej, która może być pomocna.

Powiązane problemy