dane o "zmiennej reprezentacji" do wykresu

0

Przykładowe dane pliku z danymi:

09.2345,22.125
09.2491,22.1256
09.2499,22.1251
09.25,22.1262

Plik jest wiekośći około 160 MB. Dane bedą reprezontowane na wykresie XY. Początkowo chciałem, żeby uzupełnić kolejne liczby o brakujące zera i mieć stałą wiekość bloku wiersza danych i wczytywać np. fgets, wtedy obiczenie przesunięcia w przód lub w tył od aktualnej pozycji w pliku jest banalne. Tylko, za każdym razem będę musiał plik zdanymi przepuszcać przez filtr :(
Zastanawiam się nad odzczytem binarnym i wczytywania do bloku powiedzmy 15 KB danych za jednym razem i szukanie w nim końca wiersza... I tu dochodzę do wniosku, że musiałbym cały plik zindeksować w celu zaznaczanie miejsc zakończenia wierszy.
Czy tak powinienem podejść do problemu ?

Dodam, że piszę w C i raczej używam standardowych funkcji.

0

A musisz to pisać w C?

0
Badmaneq napisał(a):

Przykładowe dane pliku z danymi:

09.2345,22.125
09.2491,22.1256
09.2499,22.1251
09.25,22.1262

(..)
Zastanawiam się nad odzczytem binarnym i wczytywania do bloku powiedzmy 15 KB danych za jednym razem i szukanie w nim końca wiersza... I tu dochodzę do wniosku, że musiałbym cały plik zindeksować w celu zaznaczanie miejsc zakończenia wierszy.

Jeżeli przedstawiłeś rzeczywisty wygląd danych w pliku, to one są już rozdzielone końcem wiersza. Jeśli są one "jedne za drugimi" to nie wiem, jak chcesz wyciągnąć te liczby, bo Twoje przykładowe dane wyglądają wtedy tak: "09.2345,22.12509.2491,22.125609.2499,22.125109.25,22.1262". Myślę, że poszczególne pary jednak są jakoś oddzielone, i na początek spróbowałbym jakimś notepad++ czy innym vimem zamienić znaki je oddzielające na znaki końca wierszy. A dalej to już wiesz co i jak robić :)

A jeśli coś źle zrozumiałem, to wytknij to wprost i wyjaśnij :)

0

Czy to są liczby zmiennoprzecinkowe rozdzielone przecinkiem?

char *line = fgets... ;

double x, y;
sscanf( line, "%lf,%lf", &x, &y) ;
0

Tak, tylko C.
Tak, dane są ort! znakim końca wiersza.

Owszem dane odzcytuję sscanf( line, "%lf,%lf", &x, &y) ;

Jednak problem jest w tym, że w każdej chwili użytkownik może zażądać przeskoku o ileś "rekordów" w przód lub w tył.

Może jakaś biblioteka ?

0

@Mr Obvious nie chodzi tutaj tylko o wczytanie tych danych, ale zrobienie to w sposób wydajny.

@Badmaneq: wszystkie te dane musisz mieć w pamięci na raz? Jeżeli nie, to czy zasoby sprzętowe pozwalają na wczytanie wszystkich danych do pamięci? Przetwarzasz je liniowo czy potrzebujesz wyszukiwać poszczególne wiersze? Ile razy wczytywany będzie dany zestaw danych (to w kwestii modyfikacji pliku, by każdy wiersz był tej samej szerokości)?

0

@Rev: Nie, tylko fragment. Domyślny blok to 500 punktów (czyli 5002double), który będzie zwizualizowany na wykresie. User przesuwa suwak w przód/tył powodując wypełnienie bloku nowymi danymi odczytanymi z pliku.
Aktualnie mam zrobione wczytywanie wierszami o stałej wielkośći, przesunięcie suwaka powoduję obliczenie przesunięcie, a następnie fseek ( fp, poz, SEEK_CUR ) po czym w pętelce fgets z sscanf. Nawet to działa kiedy znam długość wiersza, lecz kiedy plik konwertowałem pod windows został dorzucony znak \r i się program rozjechał.

0
Badmaneq napisał(a):

User przesuwa suwak w przód/tył powodując wypełnienie bloku nowymi danymi odczytanymi z pliku.

Przesuwanie suwaka w przód/tył na dużej ilości danych nie powinno wymagać dużej dokładności. Lokalne zmiany możesz załatwić odpowiednio dużą pamięcią podręczną. Ewentualnie pętla z fgetsem, żeby przejść lokalnie do odpowiedniej linii. Dzielisz plik na bloki foo*500 linii, wtedy nie powinno mielić za dużo.

Czy dana X zawsze rośnie, może liniowo? Mógłbyś to wykorzystać przy większych skokach.

0

Mr Obvious: Właśnie wtym przypadku wymaga, krok suwaka nawet o JEDEN punkt. Tak X rośnie liniowo bo to czas.
Chyba napiszę funkcję, która zindeksuj wystąpienia wszystkich znaków nowej linni w pliku, wtedy skok do dowolnego wiersza będzie stały i szybki.

0

Wrzuć ten plik do bazy danych.

0

W przyszłości kiedy komp zbierający dane (tworzący plik) zostanie zastąpiony czymś nowszym to tak. Aktualnie zainstalowanie bazy danych na nim zżarło by większość zasobów, co mogłoby spowodować pominięcie któregoś z pomiarów co jest nie dopuszczalne !

1

Skok suwaka o jeden rekord to nie jest problem, problemem jest czy potrzebujesz znać który konkretnie to jest rekord. Trochę doprecyzuję o co mi chodziło. Jesteś przy rekordzie x, wczytanie kolejnych 500 rekordów to nie problem, wywołujesz po prostu 500 razy fgets. Trochę większym problemem jest skok w tył. Jak chcesz wyświetlić rekord x-500, to ustawiasz się w pliku w pozycji x-500*(maksymalna długość rekordu w linii) i wczytujesz linie, aż do pozycji x. Sprawdzasz ile ich było, powiedzmy 513, czyli wyświetlasz dane od 13 wczytanej linii. Problemem jest jak chcesz skoczyć dokładnie do linii nr x+123523. Jeżeli nie masz stałych rozmiarów linii, to jedynym sposobem jest wyszukanie takiej liczby linii. Dlatego przy dużych skokach proponował rozwiązanie przybliżone, np user przesunie suwak na 90%, to w przybliżeniu ustawiasz się w takim miejscu pliku(90%*średnia długość linii).

Jak się zdecydujesz na indeksowanie, to nie musisz zapisywać każdej wartości pozycji nowej linii, wystarczy że zapiszesz pozycję bloków co foo*500 nowych linii, czy ile tam chcesz.

0

A co generuje ten plik z danymi? Może po prostu użyj zapisu binarnego? Wtedy każdy "wiersz" będzie miał stały rozmiar.

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