CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybki binarny odczyt pliku

Szybki binarny odczyt pliku

dział ogólny

Szybki binarny odczyt pliku

Nowy postprzez Krejzi » poniedziałek, 31 stycznia 2011, 23:24

Witam.

Jestem na etapie początkowym pisania mojej pracy magisterskiej, nie jestem super biegły w c++, a mam napisać program do odczytu plików *.wav i rysowania jego amplitudy.

Wszystko ładnie pięknie, napisałem taki program z wykorzystaniem TChart i jest elgancko poza małym waznym detalem 2 sekundowy wac wczytuje sie prawie minute.
Czy ktos jest w stanie mi podpowiedzieć jakiś sposób na szybsze czytanie pliku ?

U siebie mam zrobione w ten sposób:

KOD cpp:     UKRYJ  
ifstream plik;


I jako, że przy odczycie tego pliku potrzebuje tylko albo 2 albo 4 bity z pliku to mam takie 2 funkcje:

KOD cpp:     UKRYJ  
short getShort() {
        short a;
        plik.read((char*)&a, 2);
        ProgressBar1->Position+=2;
        return a;
}
int getLong() {
        int a;
        plik.read((char*)&a, 4);
        ProgressBar1->Position+=4;
        return a;
}


a przy rysowaniu wykresu po prostu:

KOD cpp:     UKRYJ  
while(!plik.eof()){
            Chart1->Series[0]->Add(getShort()); //lewy kanal
            Chart2->Series[0]->Add(getShort()); //prawy kanal
           }
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez polymorphism » wtorek, 1 lutego 2011, 11:12

TChart nie służy do wizualizacji plików audio. Musisz samodzielnie napisać procedurę rysowania. Swego czasu Corvis miał podobny problem, poszukaj jego tematów, może znajdziesz tam coś dla siebie.

p.s. i nie odświeżaj co próbkę progress bara, ponieważ liczba próbek z reguły idzie w dziesiątki/setki tysięcy, zatem tak częste odświeżanie spowolni znacznie czytanie pliku, a wizualnie nic nie wniesie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » wtorek, 1 lutego 2011, 12:18

Dlaczego nie słuzy ? jak dla mnie rysuje bardzo dobrze :) tylko musze teraz rozkminic skalowanie za pomocą scroll bara.

Wywalenie odswiezania progress bara nie wiele daje niestety :(. sama procedura rysowania jest błyskawiczna,
na poczatku wrzucalem dane do list boxów a z list boxów rysowałem wykres i tak działą szybko. samo czytanie z pliku jest bardzo powolne
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez Cyfrowy Baron » wtorek, 1 lutego 2011, 12:26

Czy sprawdzałeś ile czasu trwa wczytywanie 2 sekundowego pliku, bez wizualizacji w TChart?

Dobrymi komponentami do tworzenia wizualizacji dla plików audio są komponenty z pakietu TMS Instrumentation Workshop.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez polymorphism » wtorek, 1 lutego 2011, 13:26

Dlaczego nie słuzy ?

Między innymi z tego samego powodu, dla którego założyłeś ten wątek ;)

Dobrymi komponentami do tworzenia wizualizacji dla plików audio są komponenty z pakietu TMS Instrumentation Workshop.

Jeśli jest to praca magisterska, to podejrzewam, że użycie komponentów, które odwalą za niego całą robotę, nie wchodzą w grę.

___
p.s. ciekawe, jak wygląda zużycie pamięci. Dla 2 sekund o parametrach 44.1kHz/16bit/stereo wychodzi 176400 próbek, czyli 352800 bajtów. Podejrzewam, że TChart do każdego punktu dodaje dodatkowe parę bajtów, i zapewne zużycie jest znacznie większe niż te 352KB.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Cyfrowy Baron » wtorek, 1 lutego 2011, 14:08

Jeśli jest to praca magisterska, to podejrzewam, że użycie komponentów, które odwalą za niego całą robotę, nie wchodzą w grę.


TChart to też gotowy komponent, a wspomniana przeze mnie paczka komponentów, służy tylko do wizualizacji, nie można ich w żaden sposób podłączyć pod pliki. Te komponenty są tylko lepszą alternatywą niż TChart.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » wtorek, 1 lutego 2011, 18:18

Napisałem wyżej, ze samo rysowanie jest błyskawiczne. Sprawdziłem to wrzucając dane najpierw do list boxa ( w tym wypadku tez trwa to bardzo dlugo jednak sam wyciaganie danych i rysowanie jest ok ).

Wiec chyba rysowanie jest problemem a samo czytanie pliku, chyba ze wrzucic plik do pamięci a potem odczytywac z pamięci ale nie mam pojecia jak to zrealizowac i czy w ogole sie da.
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez polymorphism » wtorek, 1 lutego 2011, 18:34

Wiec chyba rysowanie [nie(?)] jest problemem a samo czytanie pliku (...)

Ani jedno, ani drugie. Problemem jest wstawianie danych do TChart.

___
p.s. magister czego?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » wtorek, 1 lutego 2011, 18:43

hmm no ale wczytując te dane do list boxów jest tak samo wolno i bez uzywania TChart'a, wiec na chwile obecną pominmy problem TChart i zmieniam pytanie.
Jak szybko wczytać te dane do list boxa ?


--
podobno magister informatyki, jednak licenciat mam z matematyki i stad moje braki w programowaniu.
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez polymorphism » wtorek, 1 lutego 2011, 19:12

Heh, a kto powiedział, że wczytywanie do listboxa jest szybkie? Właśnie sobie sprawdziłem samo czytanie plików wav strumieniem ifstream. Wyszło mi, że przeczytanie nieco ponad 4 milionów sampli trwa ~480ms. Więc jak widzisz, samo czytanie nie jest problemem.

--- dodane ---

Wątek Corvisa, który powinien Ciebie zainteresować -> http://programowanie.cal.pl/forum/viewtopic.php?f=4&t=1127
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » środa, 2 lutego 2011, 00:19

W takim razie juz nic nie rozumiem. To dlaczego jesli najpierw wrzuce powoli dane do listboxa, a nastepnie pod guzik podpialem rysowanie wykresu w TChart, to samo rysowanie z listboxa to ulamek sekundy ?

Tamten temat jest troche dla mnie niezrozumiały ponad to sprawiłby mi wiele problemu ze skalowaniem i w ogole nie wiem jak zastosowac go do siebie ;)
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez Cyfrowy Baron » środa, 2 lutego 2011, 00:23

Nie jestem pewien, ale z pliku pobierasz dane binarne, a ListBox podobnie jak TChart oczekują wartości typu AnsiString, więc opóźnienie występuje na polu dane binarne -> AnsiString, czyli konwersja. Mogę się jednak mylić...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » środa, 2 lutego 2011, 00:34

hmmm tak tu moze byc problem, moze nie sama konwersja co odczyt binarny.
Pobieram do plików typu int i typu short. TChart przyjmuje obie te artosci bez konwersji, natomiast czytajac z listboxa potrzebna byla konwersja ze string na int albo float zeby wrzucic do
TChart i nie spowalnia to widocznie.

Wiec chodzi tutaj o sam odczyt binarny, a jakbym mogl to zastapic ? :/
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Re: Szybki binarny odczyt pliku

Nowy postprzez polymorphism » środa, 2 lutego 2011, 12:28

Czy Ty, krejzi, czytasz w ogóle co się do Ciebie pisze?! Przecież pisałem, że odczyt nie jest problemem, tylko wszelkie bezsensowne konwersje, wstawiania do jakichś listboxów, chartów itp.!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki binarny odczyt pliku

Nowy postprzez Krejzi » środa, 2 lutego 2011, 13:28

no nie rozumiem, powtarzam ze z listboxa do TChart tez nastepuje konwersja ze string na float albo int a mimo to nie wplywa to na szybkosc rysowania, wiec sam tchart nie jest tutaj problemem,

Jedynie to co powiedzial czerwony baron, ze problemem jest odczytywanie binarne pliku stad moje pytanie jak zastapic binarne czytanie, myslalem zeby czytac strumieniowo i pobierac po bajcie tylko ze wtedy chyba znaczacy bit jest z drugiej strony.
Avatar użytkownika
Krejzi
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 28 stycznia 2011, 23:59
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: borland c++
Gadu Gadu: 0
    Windows 7Opera

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości