CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybki parser CSV

Szybki parser CSV

dział ogólny

Re: Szybki parser CSV

Nowy postprzez Cyfrowy Baron » czwartek, 14 października 2010, 09:44

polymorphism napisał(a):Niewielka różnica - 13 sekund. I co, ten program u Ciebie 1,5 minuty wczytuje?!


To pytanie do mnie? Jeżeli tak, to Twój program wczytywał około 25 sec. podczas gdy program Corvis'a prawie 1 minute. Faktem jest, że procesor był w tym czasie trochę zajęty innym zadaniem, którego nie mogłem zatrzymać ze względu, na to iż utraciłbym efekt 2 godz. pracy. Z porównania jednak wynikało, że drugi program jest o połowę wolniejszy, a warunki pracy w obydwu przypadkach były takie same.
Program dużo traci na parsowaniu pliku, więc lepszym rozwiązaniem byłby plik binarny, z wykorzystaniem np. struktury, odszedłby czas potrzebny na parsowanie.
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 parser CSV

Nowy postprzez polymorphism » czwartek, 14 października 2010, 10:08

To pytanie do mnie?

Nie, to było do Corvisa, który twierdził, że u niego program czytał plik w 1,5 minuty, co trochę mnie zdziwiło, wszak różnice w pomiarach były zbyt duże przy podobnej konfiguracji sprzętowej. Ale już wiadomo, w czym był problem...

Program dużo traci na parsowaniu pliku (...)

Czy tak dużo? Na taką ilość danych to i tak ładne wyniki są, sam jestem zaskoczony. Podejrzewam, że wąskim gardłem w tym przypadku będzie umieszczanie przeczytanych danych w jakiejś bardziej złożonej strukturze. Oczywiście użycie formatu binarnego przyśpieszyłoby odczyt, no ale nie zawsze masz taką dowolność w doborze sposobu składowania danych. Czasem sytuacja wymusza użycie takiego a nie innego formatu.
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 parser CSV

Nowy postprzez Cyfrowy Baron » czwartek, 14 października 2010, 10:15

Przyjrzałem się przykładowi z tego postu:http://www.programowanie.cal.pl/forum/viewtopic.php?f=2&t=1087&start=15#p7598 i nie widzę tam kodu odpowiedzialnego za wprowadzanie danych do tabeli StringGrid, to wygeneruje dodatkowe opóźnienia, a ta tabela nie należy do najszybszych.
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 parser CSV

Nowy postprzez polymorphism » czwartek, 14 października 2010, 10:29

Właśnie o tym pisałem. To, czy użyjesz formatu binarnego, czy tekstowego, i tak nie zmieni faktu, że najwolniejsze będzie wpisywanie tych danych do jakiegoś bardziej złożonego kontenera.

(...) a ta tabela nie należy do najszybszych.

A czy StringGrid, podobnie jak ListView, nie ma przypadkiem możliwości pracy w trybie wirtualnym (lub zapewnia mechanizm, który umożliwia podłączenie zewnętrznego kontenera)?
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 parser CSV

Nowy postprzez Cyfrowy Baron » czwartek, 14 października 2010, 10:59

Jedyny sposób w jaki możesz wypełnić tą tabelę to:

KOD cpp:     UKRYJ  
 StringGrid1->Cells[x][y] = "UnicodeString lub AnsiString";
 StringGrid1->Rows[x] = TStrings *;
 StringGrid1->Cols[y] = TStrings *;


Tabela posiada jeszcze metodę:

KOD cpp:     UKRYJ  
 StringGrid1->InitInstance(void * instance);


O której można przeczytać:


System.TObject.InitInstance

Initializes a newly allocated object instance to all zeros and initializes the instance's virtual method table pointer.

You should not call System.TObject.InitInstance directly. System.TObject.InitInstance is called by System.TObject.NewInstance when an object is created. When overriding System.TObject.NewInstance, be sure to call System.TObject.InitInstance as the last statement.

System.TObject.InitInstance is not virtual, so you cannot override it. Instead, initialize any data for an object in the constructor.



Nie wiem jednak jak można by to wykorzystać i czy pisząc o trybie wirtualnym to masz na myśli.
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 parser CSV

Nowy postprzez polymorphism » czwartek, 14 października 2010, 11:46

Nie, tam jest mowa o metodach wirtualnych, a ja pisałem o trybie pracy kontrolki ListView, która to w tym trybie nie jest kontenerem, jej funkcja ogranicza się do wyświetlania (zewnętrznych) danych i reagowania na akcję użytkownika. Jeśli chodzi o StringGrid, faktycznie nie ma takiego trybu, ale da się to zrobić z TCustomDBGrid i własną implementacją TDataSet.
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 parser CSV

Nowy postprzez polymorphism » piątek, 15 października 2010, 13:35

Z ciekawości sprawdziłem, jak w wxWidgets będzie wyglądać ładowanie pliku CSV do grida, wykorzystując metodę, o której wcześniej pisałem. Wyniki, tak jak się spodziewałem, są zadowalające. Przetwarzanie pliku jest nieco wolniejsze od wersji konsolowej, ale przy takiej ilości danych nie robi to większej różnicy. Tak sobie myślę, że można by to jeszcze zoptymalizować, ale...

Dla zainteresowanych załączam plik
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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 parser CSV

Nowy postprzez Corvis » czwartek, 2 grudnia 2010, 11:45

polymorphism sprawdzałeś swój kod dla plików zmienno przecinkowych ????

    1,31; 1,31;0;0;0
    1,31; 1,31;0;2;0
    1,31; 1,31;0;2;0
    1,31; 1,31;0;2;0
    1,31; 1,31;0;2;0

Zamieniłem przerwy między polami na średniki w kodzie też zmieniłem ale ładuje mi same jedynki. Właśnie szukam przyczyny takiego stanu.

Edit:

Dorzuce jeszcze kod:

KOD cpp:     UKRYJ  
        if(file.is_open()) {
                typedef std::num_get<char,char*> num_get_type;
                char cell_text[100];
                char* p2 = cell_text + sizeof(cell_text);
                const num_get_type &ng = std::use_facet<num_get_type >(file.getloc());
                char c = 0;
                double v = 0;
                Tik pomocniczny;
                while(c != EOF) {
                        c = 0;
                        v = 0;
                        pomocniczny.WartosciTikow.clear();
                        while(c != '\n') {
                                char* p1 = cell_text;

                                while(p1 < p2 &&
                                        (*p1 = file.rdbuf()->sbumpc()) != EOF &&
                                        *p1 != this->Separator &&
                                        *p1 != '\n') ++p1;

                                if(p1 == p2) throw std::overflow_error("cell is too big!");
                                c = *p1;
                                if(p1 == cell_text) break;

                                char *p3 = cell_text;
                                while(p3 != p1 && isspace(*p3)) ++p3;

                                std::ios_base::iostate err = std::ios::goodbit;

                                ng.get(p3,p1,file,err,v);

                                pomocniczny.WartosciTikow.push_back(v);

                                if(err & (ios::failbit | ios::badbit)) {
                                        throw std::invalid_argument("");
                                }
                        }
                        if(pomocniczny.WartosciTikow.size()>0) this->Dane.push_back(pomocniczny);
                }
 
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez Corvis » czwartek, 2 grudnia 2010, 12:16

Znalazłem problem ale niewiem jak sobie z nim poradzić:

Kod: Zaznacz cały
ng.get(p3,p1,file,err,v);


Otrzymuje w p3 cos takieg: 1,234455 z przecinkiem jeżeli otrzyma z krokpą 1.234455 to wszystko działa super. Ma ktoś na to radę żeby nie zepsuć szybkości działania algorytmu ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » czwartek, 2 grudnia 2010, 12:28

Trzeba ustawić locale na polskie. Teraz jest domyślne, czyli C, gdzie przecinkiem dziesiętnym jest kropka.

Daj:
KOD cpp:     UKRYJ  
if(file.is_open())
{
        file.imbue(locale("")); //<--- ustawia locale systemowe
        ...
 

I powinno być git.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
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 parser CSV

Nowy postprzez Corvis » czwartek, 2 grudnia 2010, 12:38

Dokładnie tak !!!!! dzięki
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 15 grudnia 2010, 15:45

polymorphism

Mam jeszcze jedno pytanie odnośnie tego kodu do odczytu danych z pliku.

W którym miejscu jest tutaj skok do następnej linii ?? bo próbuje napisać skok np do 100 lini w pliku. Zacząłem czytać dokumentacje tych funkcji które tam są ale jakoś na razie nie mogę dojść o co chodzi.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 15 grudnia 2010, 16:08

W którym miejscu jest tutaj skok do następnej linii ??

Tam podziału na linie sensu stricto nie ma - bo i po co? Znak końca linii jest traktowany jak jeden z delimiterów:
KOD cpp:     UKRYJ  
while(p1 < p2 &&
        (*p1 = file.rdbuf()->sbumpc()) != EOF &&
        *p1 != this->Separator &&
        *p1 != '\n') ++p1; //<--- tu


(...) bo próbuje napisać skok np do 100 lini w pliku.


Spróbuj tak:

KOD cpp:     UKRYJ  
int n = 100; //<--- index linii

char c;

while(n != 0 && (c = file.rdbuf()->sbumpc()) != EOF)
{

        if(c == '\n')--n;

}


Jeśli będziesz często skakał po pliku, to to nie jest zbyt optymalny sposób, szczególnie jeśli pliki będą naprawdę duże.



p.s. czy format pliku to wymóg, czy po prostu dane spływają w tym formacie?
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 parser CSV

Nowy postprzez Corvis » czwartek, 16 grudnia 2010, 10:41

polymorphism napisał(a): p.s. czy format pliku to wymóg, czy po prostu dane spływają w tym formacie?


Dane zbieram sam w formacie *.csv na tą chwilę mam 8 kolumn, ale kiedyś może się to zmienić np na więcej albo mniej kolumn. Potem te dane przeliczam i oglądam wyniki na wykresie. Tak więc, żaden wymóg i jeżeli jest sposób na przyśpieszenie tego poprzez np. inny format danych to zawsze będę mógł to zmienić (w przyszłości bo na tą chwile mam dużo danych które muszę przeliczyć i narysować)

Właśnie doczytuje dokumentacje funkcji na podstawie których zrobiłeś ten kod. W sumie nawet nie wiedzałem, że są takie funkcje hehe.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » czwartek, 16 grudnia 2010, 11:04

Jeśli to nie jest wymóg, to lepiej zmień format na binarny, ponieważ po takim formacie łatwiej się poruszać.
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

Poprzednia stronaNastę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 5 gości