Šta je novo?

Python

Vegeta

Cenjen
Učlanjen(a)
15.10.2011
Poruke
972
Poena
180
Do sada sam za otvranje i analiziranje podataka koristio FORTRAN (forsirali ga na faksu), međutim pošto je traženje programera sa znanjem ovog jezika nikakva, prebacio sam se na PYTHON. Za potrebu otvaranja dokumenta velikog kapaciteta (~900mb, 18262x5898) koristim sledeću komandu :
Kod:
data1 = np.loadtxt("CARPATGRID_TA_D.ser",skiprows=1)
.

Problem je u brzini otvaranju, PC iz potpisa treba oko 1min dok na laptopu otvara za 5min(B810,4GB ram)! Kada ga i otvori, prisupanje određenom indeksu(vrednosti date tačke) traje jako sporo. Slične dokumente FORTRAN odradi daleko brže. Da li ja pravim neku grešku?
 
Python je interpreterski jezik i zato je i spor. Probaj c/c++ ili možda javu ili javascript.

Sent from my Pixel 2 XL using Tapatalk
 
Slične dokumente FORTRAN odradi daleko brže.

Ma nemoj da pricas. Jel znas da numericke biblioteke u velikoj vecini jezika na kraju pozivaju LAPACK sto upravo numericka biblioteka pisana u Fortranu. Nema brze nit je trenutno moguce brze.

Sto se pajtona tice rekli su ti ljudi. @Neky je dao odlican savet ali ljudi koji koriste pajton vole gotove funcije a ne da pisu svoje, to je ono sto ih razlikuje od C/C++ programera. Pajton su lego kockice za mnoge. Ne znam kako bi to islo preko PyPy ako je uopste izvodljivo u tvom slucaju. Nisam puno koristio PyPy.
 
Ma nemoj da pricas. Jel znas da numericke biblioteke u velikoj vecini jezika na kraju pozivaju LAPACK sto upravo numericka biblioteka pisana u Fortranu. Nema brze nit je trenutno moguce brze.


Ne znam čemu odmah ovakav nastup, FORTRAN sam naveo čisto radi poređenja. Upoznat sam zašto se ovaj jezik i dalje koristi, pogotovo u meteorologiji koju sam i studirao.
Problem je i u internet, jer svako priča svoju priču (nemoj da koristiš petlje daleko su sporije od numpy i pandas-a) a realnu sliku vidiš tek kada se susretneš sa problemom.

Hvala na savetima, uzeću ih na razmatranje.
 
Poslednja izmena:
Nemoj se sikirati, enterthevoid je takav, ali je inače dobar i koristan. :d

Inače probaj sa C++-om ako ti ide jer imaš dosta velik community koji sigurno nailazi na slične probleme. Inače za to što ti treba i dalje možeš koristiti Fortran, a Python za ostalo.
 
Poslednja izmena:
Inače za to što ti treba i dalje možeš koristiti Fortran, a Python za ostalo.

Kao što sam i napisao, na faksu smo učili FORTRAN ali pošto je nalaženje posla poznavajući ovaj jezik teško, bacio sam se na učenje PYTHON-a (sve veća upotreba u meteorologiji). Pošto mi je još ostalo napisati master rad, profesor( na moje insistiranje) mi je dao temu gde ću analizu podataka umesto u FORTRANU odraditi u PYTHONU. Znači, otvaranje baze podataka u periodu od 1961-2010 i crtanje polja temperature, pritiska, padavina.......Nešto tipa, zadaš kordinate tačke, izabereš godinu za koju te interesuju podaci i dobijaš rezultate. Više informacija CARPATCLIM
 
Poslednja izmena:
Pa sad, jezik je takav kakav je, pruža ti visok nivo apstrakcije, ali onemogućava kontrolu na nižem nivou. Samim tim je jako spor u poređenju sa nižim jezicima, a nije nešto brz ni kad se poredi sa jezicima koji su na sličnom nivou apstrakcije, Javascript (Node.js) je u ogromnoj mjeri brži iako je takođe interpretiran programski jezik, ali postoji znatna razliku između dva jezika u globalu.
 
Možeš li da probaš ovako nešto?

Kod:
def get_lines(file_path):
    with open(file_path, 'r') as input_file:
        for line in input_file.readlines():
            yield line.strip()

for line in get_lines("CARPATGRID_TA_D.ser"):
    # nesto

Takođe bi mogao da razmisliš o snimanju sadržaja fajla u neku bazu. Baze možeš da indeksiraš čime ubrzavaš pristup podacima. Ako imaš mogućnost, okači fajl negde, voleo bih da ga "probam" - 900MB nije mnogo.

:EDIT:
Skinuh neki CSV fajl od ~924MB (8925900 linija) pa sam testirao kod od gore. Na mašini iz potpisa, printovanje celog fajla, liniju po liniju, traje 87 sekundi i pojede ~1.4GB RAM. Ako ne printujem linije u terminal (Konsole je spoooor) nego samo čitam fajl, sve bude gotovo za 5 sekundi.
 
Poslednja izmena:
Možeš li da probaš ovako nešto?

Kod:
def get_lines(file_path):
    with open(file_path, 'r') as input_file:
        for line in input_file.readlines():
            yield line.strip()

for line in get_lines("CARPATGRID_TA_D.ser"):
    # nesto

Takođe bi mogao da razmisliš o snimanju sadržaja fajla u neku bazu. Baze možeš da indeksiraš čime ubrzavaš pristup podacima. Ako imaš mogućnost, okači fajl negde, voleo bih da ga "probam" - 900MB nije mnogo.

Dokument mozeš skinuti odavde. Nije potrebna registracija, samo popuni polja.......
 
Poslednja izmena:
Možeš li da probaš ovako nešto?

Kod:
def get_lines(file_path):
    with open(file_path, 'r') as input_file:
        for line in input_file.readlines():
            yield line.strip()

for line in get_lines("CARPATGRID_TA_D.ser"):
    # nesto

Takođe bi mogao da razmisliš o snimanju sadržaja fajla u neku bazu. Baze možeš da indeksiraš čime ubrzavaš pristup podacima. Ako imaš mogućnost, okači fajl negde, voleo bih da ga "probam" - 900MB nije mnogo.

:EDIT:
Skinuh neki CSV fajl od ~924MB (8925900 linija) pa sam testirao kod od gore. Na mašini iz potpisa, printovanje celog fajla, liniju po liniju, traje 87 sekundi i pojede ~1.4GB RAM. Ako ne printujem linije u terminal (Konsole je spoooor) nego samo čitam fajl, sve bude gotovo za 5 sekundi.

readlines() generise listu tako sto ucita kompletan fajl u memoriju.

Ako te zanima samo po jedna linija u memoriji onda koristis file object iterator:

Kod:
with open(file_path, 'r') as input_file:
        for line in input_file:
            yield line.strip()
 
Hvala!
 
Ljudi treba mi mala pomoć. Problem koji sam postavio sam uspešno rešio koristeći pandas modul :
Kod:
df = pd.csv_read(' putanja do dokumenta ')
Koristeći ovaj kod, otvaranje 850mb dokumenta traje oko 1min, što je prihvatljivo. Mesečne srednjake, dokument veličine ~ 200mb, otvara jako brzo.

Napravio sam program pomoću kojeg ulazim u bazu podataka i definisanjem godine, mesec, dan dobijam podatake za taj period. Sada me zanima kako ovaj program pokrenuti na web stranici, odnosno kako povezati Python program sa internetom? Može neki savet, preporuka za knjigu kako bih malo više ušao u ovu problematiku.......
 
Poslednja izmena:
Da, klasičan problem u developmentu, gomila ljudi pita za slične stvari. Šta će da radi ta web aplikacija? Da li će ona u pozadini da čita te velike PDF fajlove i vraća output ili samo ide do baze i vraća već obrađene podatke? Nadam se da je drugi slučaj u pitanju, jer u prvom bi morao da imaš asinhrone taskove koristeći Celery recimo.

Takođe, kako će funkcionisati frontend? Da li želiš da imaš potpuno odvojen frontend koji će praviti API pozive ka tvom servisu, ili želiš sve integrisano? Da li će korisnik aplikacije menjati podatke ili ih samo čitati?

Zvuči mi kao da bi Django bio dovoljno dobro rešenje. Dokumentacija je dobra, primera ima mnogo, i to je 'batteries included' rešenje u kom imaš ORM za komunikaciju sa bazom, template engine i admin panel out-of-the-box. Piši kad zapneš :)
 
Kao prvo hvala na savetima :)

Ovako, napisaću kako sam ja shvatio profu. Umesto unošenja kriterijuma za pretragu u terminalu( puštanje programa i odabir ponuđenih opcija), omogućiti izbor ponuđenih opcija programa koristeći internet. Znači, na sajtu se izabere da li želiš godišnje, mesečne dnevne vrednosti nakon čega dobijaš podatke(za uneti period) upisane u csv fajl, ili grafički prikaz(ovo je opciono). Korisnik ima ponuđene opcije pa izabere šta želi. Podaci o izmerenim vrednostima bi bili na serveru. Nadam se da sam malo bolje objasnio situaciju :)
Ja sam nešto gledo i naišao na ovo, međutim ne znam da li bi to radilo u ovom mojom slučaju.
 
Poslednja izmena:
Kako to misli "koristeći internet"... koristeći internet browser, ili da program juri negde podatke po internetu i prikaže ih na stranici? Skroz konfuzno. Takođe, čitanje direktno iz tog CSV fajla nikako nije primereno da se radi direktno. Zamisli web aplikaciju gde na odgovor čekaš jedan minut - to se tako ne radi.

Najprostije rešenje je da taj CSV lepo isparsiraš kodom koji već imaš, i da podatke upišeš u nekakvu bazu. Posle toga napraviš Django projekat, povežeš ga na tu bazu i pišeš upite kao čovek. Mani se PHPa :)
 
Kao prvo hvala na savetima :)

Ovako, napisaću kako sam ja shvatio profu. Umesto unošenja kriterijuma za pretragu u terminalu( puštanje programa i odabir ponuđenih opcija), omogućiti izbor ponuđenih opcija programa koristeći internet. Znači, na sajtu se izabere da li želiš godišnje, mesečne dnevne vrednosti nakon čega dobijaš podatke(za uneti period) upisane u csv fajl, ili grafički prikaz(ovo je opciono). Korisnik ima ponuđene opcije pa izabere šta želi. Podaci o izmerenim vrednostima bi bili na serveru. Nadam se da sam malo bolje objasnio situaciju :)
Ja sam nešto gledo i naišao na ovo, međutim ne znam da li bi to radilo u ovom mojom slučaju.

Posto kazes "na sajtu" pretpostavljam da se misli na izvrsavanje tog tvog python koda na nekom web serveru. Neki najprostiji nacin izvrsavanja na http serveru je Common Gateway Interface (CGI), o tome imas ovde detaljno, https://docs.python.org/2/library/cgi.html

Racunaj da vreme izvrsavanja na web serveru moze biti vremenski ograniceno do npr. 30 sekundi, takodje i ram memorija moze biti ogranicena. Tako da ces verovatno morati da ubrzas izvrsavanje koda na nacin koji je @Neky predlozio. Moguca opcija je da koristis recimo SQLite, o tome imas ovde, https://docs.python.org/2/library/sqlite3.html
 
Nazad
Vrh Dno