Wczytywanie .obj a wydajność

0

Chcę wczytać kilka plików Wavefront 3D Object (.obj) do aplikacji OpenGL. Przykładowy plik z niezbyt dużym obiektem ma 177 KB i 4730 linijek. Jak wczytać dane z takiego pliku ze zwróceniem uwagi na wydajność i minimalizację I/O?

  1. Wczytywanie każdej linii osobno za pomocą fgets lub fscanf
  2. Wczytanie całego pliku do tablicy znaków char[] i analizowanie każdej linijki
  3. Inny sposób?

Komentarze zaczynają się od # i takie linijki należy pominąć. Niektóre wartości są opcjonalne. W pierwszym przypadku wczytywanie linijek może zostać przyspieszone przez buforowanie całego pliku, o ile to możliwe. Istnieje funkcja setbuf - czy ona obejmuje również odczytywanie z pliku, czy tylko zapis? W drugim przypadku trzeba pobrać rozmiar pliku (fstat lub fseek+ftell), wczytać go do tablicy znaków, a następnie wydobyć dane. Wydobycie danych prawdopodobnie nie obędzie się bez scanf/fscanf.

Jak do tego podejść, jakie funkcje wykorzystać, aby wczytać dane niewielkim kosztem operacji I/O i procesora?

0

Jeżeli plik jest mały (w porównaniu z RAM), to zawsze najszybciej wczytuje się cały plik do bufora o jego wielkości w jednej operacji. Można sobie czasem zoptymalizować jeżeli wartościowe dane z tego pliku znajdują się na początku, w środku lub na końcu przez przesunięcie wskaźnika pliku i odczytanie w jednej operacji skróconego obszaru do jednego bufora. W każdym innym wypadku najszybsze jest odczytanie całości pliku.
Mając dane w pamięci można się zabrać za parsowanie.

Jeżeli plików trzeba wczytać więcej, to warto sobie odpalić zadanie na drugim wątku z priorytetem idle i w nim sobie spokojnie wypełniać kolejne bufory i zaznaczać ich wypełnienie.
W tym czasie kiedy tylko pierwszy bufor będzie gotowy może się zacząć jego parsowanie i po nim kolejnych. Dzięki takiemu podejściu maksymalnie będzie wykorzystany zarówno CPU jak i operacje dyskowe, które z CPU prawie nie korzystają.

Gdyby robić to na jednym wątku, to (szybkie) parsowanie zawsze musi czekać na bardzo powolny odczyt danych.
Najwolniejsza możliwa wersja to odczyt pliku po jednej linijce z pliku i parsowanie. Operacje szybkie przeplatają się wtedy z wolnymi na jednym wątku robiąc dodatkowo narzut na dostęp buforowany po znakach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1