[#1] Dziwne wczytywanie danych
W c++ ver. 4.4.3 używam następujących operacji do wczytania pliku:

void wczytaj (string sNazwa)
{
cout <<"1:" << endl;
fstream plik_odczyt;
cout <<" 1 koniec" << endl;
cout <<"2:" << endl;
plik_odczyt.open ((sNazwa.c_str()),ios::in|ios::binary);
cout <<" 2 koniec" << endl;
cout <<"3:" << endl;
plik_odczyt.seekg (0,ios::end);
cout <<" 3 koniec" << endl;
cout <<"4:" << endl;
i_DlugoscPliku = plik_odczyt.tellg();
cout <<" 4 koniec" << endl;
cout <<"5:" << endl;
pc_Dane = new char [i_DlugoscPliku]; // i_DlugoscPliku zamiast BAJT
cout <<" 5 koniec" << endl;
cout <<"6:" << endl;
plik_odczyt.seekg (0, ios::beg);
cout <<" 6 koniec" << endl;
cout <<"7:" << endl;
plik_odczyt.read (pc_Dane, i_DlugoscPliku); // i_DlugoscPliku zamiast BAJT
cout <<" 7 koniec" << endl;
cout <<"8:" << endl;
plik_odczyt.close ();
cout <<" 8 koniec" << endl;
}

Okazuje się, że niektóre pliki wczytują się dłużej a nie które wolniej. Konkrety otóż mam plik 20 mb wczytuje się około 10 min do pamięci a inny 30,5 mb wczytuje się 6s. - to nie literówa. Po wypunktowaniu operacji okazuje się, że winna jest temu operacja nr 7 plik_odczyt.read (pc_Dane, i_DlugoscPliku);. W czym tkwi przyczyna? Zależy mi na kompatybilności kodu z windows i mos. Wczytuję przy jej pomocy różne pliki wav. Wczytywanie danych do pamięci jest oddzielną funkcją.

[#2] Re: Dziwne wczytywanie danych

@ZED^lM, post #1

Może winna temu jest fragmentacja tych plików? Spróbuj je skopiować ręcznie do RAMu i sprawdź ile to trwa. Przy okazji - kawałkami jakiej wielkości wczytujesz te pliki? Tylko proszę nie pisz, że znak po znaku...

[#3] Re: Dziwne wczytywanie danych

@Marek Szyprowski, post #2

kawałkami jakiej wielkości wczytujesz te pliki?

Z kodu wynika, że wczytywany jest cały plik w całości.

[#4] Re: Dziwne wczytywanie danych

@Grzegorz Kraszewski, post #3

No dobra, ślepy jestem. W takim razie najprawdopodobniej to problem wyjątkowo dużej fragmentacji tego pliku.

[#5] Re: Dziwne wczytywanie danych

@Marek Szyprowski, post #4

Jest na to jakiś sposób by to przyśpieszyć? Tak plik jest wczytywany w całości. W przyszłości zoptymalizuje to. Dodam, że na pc wygląda to normalnie.

[#6] Re: Dziwne wczytywanie danych

@ZED^lM, post #5

A jak długo owy plik kopiuje się do RAMu (np. z Ambienta)?

[#7] Re: Dziwne wczytywanie danych

@ZED^lM, post #1

A próbowałeś wczytywać mniejszymi blokami do pamięci? Winny może być np alokator pamięci w C++. Nie wiem jak to jest zaimplementowane w gcc, ale najpierw zrobiłbym porównanie przy użyciu statytycznego bufora. Co więcej :

plik_odczyt.read (pc_Dane, i_DlugoscPliku);

nie jest operacją atomową - zobacz co tak naprawdę dzieje się w ramach wywołania read() bo kompilator przesłania tak naprawdę wykonywany kod.

Przyszedł mi do głowy inny test: odczytaj plik za pomocą funkcji open() z stdio.h i porównaj wyniki.

[#8] Re: Dziwne wczytywanie danych

@Marek Szyprowski, post #6

Z tego co pamiętam (nie mam przy boku pegaza) to nie było zasadniczej różnicy jeśli chodzi o czas wczytywania owego pliku. Można powiedzieć, że normalnie się wczytuje. Na obecną chwilę to wszystkie operacje z tym związane robię w ramie. Wczytuję plik do ramu i wtedy uruchamiam program.

[#9] Re: Dziwne wczytywanie danych

@alekc, post #7

Było by zrozumiałe gdyby owy proce przebiegał długo na wszyskich plikach wczytywanych do pamieci. Jeden plik wav zripowany bezpośrednio z płyty wczytuje się około 6s. i ma wielkość 30,5Mb (format wav pcm bez kompresji) a drugi nagrany na mptrójce z opcją nagrywania (format imadpcm nie jestem dokładnie pewien). Jak będe w domu to mogę podać dokładne parametry plików. Wielkość jego i czas wczytywania jak napisałem na samym początku.



Ostatnia modyfikacja: 22.03.2010 08:13:03
[#10] Re: Dziwne wczytywanie danych

@ZED^lM, post #9

Wszystko zależy od algorytmu alokacji pamięci dla operacji. Jeśli jest niewydajny dla konkretnych przypadków to właśnie może być przyczyna. Co prawda wątpię żeby taki problem był w gcc, więc teoretycznie winnym może być system operacyjny.

Nie robiłem nigdy testów dla żadnego systemu ale biorąc pod uwagę że w AOS 4.x pojawił się alokator płytkowy to w tym przypadku winny nie powinien być system operacyjny. W przypadku innych systemów: nie wiem. Naprawdę jednak spróbował bym odczytać plik z pomocą stałego bufora i porównać wyniki.
[#11] Re: Dziwne wczytywanie danych

@alekc, post #10

alokator mosa jest dosc zaawansowany (w czesci przypadkow lepszy niz slab):

http://wiki.morphos-user.com/index.php/In-depth:_The_New_MorphOS_Memory_System

[#12] Re: Dziwne wczytywanie danych

@rzookol, post #11

W takim razie przyczyn bym szukał w kodzie wygenerowanym przez kompilator. Czy ktoś przeglądał listę poprawek dla gcc - może jest podobny bug opisany?
[#13] Re: Dziwne wczytywanie danych

@alekc, post #12

I co - są jakieś wyniki? Bardzo mnie ciekawi rozwiązanie tej historii.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem