Wielkie pliki - wielkie problemy ??

dział ogólny

Wielkie pliki - wielkie problemy ??

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 10:25

Witam,

Natrafiłem na 2 problemy pisząc programy i chciałbym zasięgnąć waszej opinii w tych tematach.

1. Mam program do którego wczytuje dane z pliku *.CSV następnie gdy go wczytam np do wektora iteruje po wektorze wykonując obliczenia. - Wszystko super extra gdy plik zajmuje do 100 MB ale gdy wrzuciłem plik ważący 1GB to chyba mi pamięci zabrakło i wywaliło błąd: external exception eefface. Co skłoniło mnie do wniosku, że można chyba zrobić te obliczenia inaczej - pomijając dodatkowy bufor w postaci wektora. Np. Wybieram plik i zamiast go wczytywać do wektora czy innego bufora, odrazu separuje dane z *.CSV i wykonuje obliczenia. Tylko takie rozwiązanie chyba spowoduje wydłużony czas obliczenia :roll: Co myślicie ??


2. Drugi problem wiąże się bezpośrednio z pierwszym gdyż dotyczy rysowania wykresów danych które otrzymuje z danych z pkt1. Wszystko super jeżeli pliki są do 100 MB ale jak narysować wykres danych z pliku 1GB ? :roll:

Może ktoś z was przerabiał podobne zagadnienia i może podzielić się doświadczeniami ??


Pozdrawiam
"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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Cyfrowy Baron » wtorek, 14 grudnia 2010, 10:39

Nie napisałeś w jaki sposób wczytujesz ten plik, ale zapewne od razu w całości. Być może rozwiązaniem problemu byłoby użycie klasy fstream (ofstream) i wczytywanie kolejnych linii z pliku za pomocą funkcji getline.



Wszystko super jeżeli pliki są do 100 MB ale jak narysować wykres danych z pliku 1GB ? :roll:


W tym wszechświecie żadne zjawiska nie zachodzą natychmiast, więc 1 GB musi wykonywać się 10 razy wolniej niż 100 MB, gdyż 100 x 10 = 1000 MB.
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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 10:49

Dane wczytuję tak:

viewtopic.php?f=2&t=1087&hilit=Szybki+parser&start=15

Tutaj byłą dyskuja na temat szybkiego wczytywania danych i rysowania.
"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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Cyfrowy Baron » wtorek, 14 grudnia 2010, 11:03

Czyli jak rozumiem masz już kod na szybkie wczytywanie. Pewnie bardziej już się tego przyspieszyć nie da. Co do problemu z brakiem pamięci, to oczywiście rozwiązaniem jest to o czym pisałem wcześniej, czyli nie wczytywać całego pliku od razu, ale wczytać kilkaset linii, przetworzyć, wczytać kolejne, itd..
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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Cyfrowy Baron » wtorek, 14 grudnia 2010, 13:51

Nie bardzo rozumiem dlaczego decydujesz się na tworzenie jednego wielkiego pliku. Ja raczej tworzyłbym wiele małych. Pierwszy plik zawierałby ileś tam linii, a po osiągnięciu limitu tworzony byłby wg. jakiegoś klucza kolejny plik. Każdy plik na końcu mógłby umieszczać linię z informacją o lokalizacji kolejnego pliku. Dzięki temu zniknąłby problem z brakiem pamięci. Po przetworzeniu jednego pliku program przechodziłby do kolejnego.
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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 14:34

Ja juz dostałem takie pliki i teraz muszę sobie z nimi poradzić. Zastanawia mnie tylko jedno, przy twojej metodzie mając rocznie np 12 plików po 200 mb każdy potem chce wszystkie do kupy zebrać i obejrzeć na wykresie - to czy twoja metoda nie jest wolniejsza od skakania po 1 dużym pliku ?? Otwieranie każdego kolejnego podbieranie danych zamykanie pliku troche kosztuje.
"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: Wielkie pliki - wielkie problemy ??

Nowy postprzez polymorphism » wtorek, 14 grudnia 2010, 14:36

Akurat rozwiązanie z wieloma plikami niewiele tu rozwiązuje, bo jeśli może czytać dane pofragmentowane na mniejsze pliki, to i duży plik może przecież czytać fragmentami.

Jeśli dane są czytane i przetwarzane w sposób sekwencyjny, to nie trzeba ładować ich w całości do pamięci. Wystarczy na bieżąco czytać tyle danych, ile potrzeba do wykonania obliczeń.
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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Corvis » wtorek, 14 grudnia 2010, 14:40

Czyli:

- Rezygnacja z bufora w postaci wektora
- Jeżeli plik ma 1000 lini w kazdej lini 6 kolumn ja chce zobacze na ekranie dane od lini 1 do 10 to odczytuje z pliku te 10 lini i podczas odczytu wydzielam dane w taki sam sposób jak to robię w poście Szybki Parser CSV. - w sumie logiczne i chyba nie bardzo skomplikowane do zrobienia.


Ps. Ale czy taki sposób jest optymalny przy konieczności korzystania z danych cały czas ? Np. Mam te 1 GB danych i chce obliczyć coś z nich z parametrem x. Lece po nich raz mam wynik, następnie chce obliczyć coś z x2 i znowu muszę lecieć i separować... :roll:
"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: Wielkie pliki - wielkie problemy ??

Nowy postprzez polymorphism » wtorek, 14 grudnia 2010, 14:56

Gorzej jeśli będzie miał 20 000 000 rekordów, a na ekranie będzie chciał zobaczyć rekordy z przedziału np. <18 000 000, 18 000 020> ;) Wtedy trzeba wygenerować plik z indeksami.

Ps. Ale czy taki sposób jest optymalny przy konieczności korzystania z danych cały czas ? Np. Mam te 1 GB danych i chce obliczyć coś z nich z parametrem x. Lece po nich raz mam wynik, następnie chce obliczyć coś z x2 i znowu muszę lecieć i separować...

No a jak inaczej to sobie wyobrażasz? Oczywiście nie wykonujesz rzeczy, które nie są potrzebne, np. jeśli operujesz na jednej kolumnie, to nie konwertujesz pozostałych 5 z tekstu na float, po prostu je pomijasz.
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: Wielkie pliki - wielkie problemy ??

Nowy postprzez Corvis » środa, 15 grudnia 2010, 09:51

Dobra to jeszcze jedno pytanie:

Jeżeli już sobie określę odkąd dokąd chce oglądać dane na ekranie (wykresy) to czy w procedurze malowania odczytywanie danych do namalowania bez użycia bufora w postaci wektora to na pewno dobry pomysł ?? W samym malowaniu nie widzę problemów ale np potem przesuwając mysz nad wykresem chce odczytać jego wartość to muszę: wyliczyć w której linii ona jest, skoczyć do niej w pliku i wyseparować daną - a to już chyba będzie bolało.
"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: Wielkie pliki - wielkie problemy ??

Nowy postprzez polymorphism » środa, 15 grudnia 2010, 10:56

W tym przypadku oczywiście korzystasz z jakiegoś bufora, tyle że nie czytasz do niego całości danych, tylko tyle, ile w danym momencie jest potrzebne.
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


  • 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 12 gości

cron