Fedora-Linux.nl Forumindex Fedora-Linux.nl
Het forum van Fedora-Linux.nl.
Deze site wordt gehost door Exonet Internet Services
 
 FAQFAQ   ZoekenZoeken   GebruikerslijstGebruikerslijst   GebruikersgroepenGebruikersgroepen   RegistrerenRegistreren 
 ProfielProfiel   Log in om je privéberichten te bekijkenLog in om je privéberichten te bekijken   InloggenInloggen 

verwijderen eerste regel van erg lange file

 
Nieuw onderwerp plaatsen   Reageren    Fedora-Linux.nl Forumindex -> Programmeren en scripten
Vorige onderwerp :: Volgende onderwerp  
Auteur Bericht
NikkiMassa



Geregistreerd op: 17 Sep 2006
Berichten: 355
Woonplaats: Vries

BerichtGeplaatst: Do Jun 03, 2010 3:37 pm    Onderwerp: verwijderen eerste regel van erg lange file Reageren met citaat

Hoi,

Ik ben het file-formaat van een hele grote file aan het omzetten naar een ander file-formaat. Dat vereist 3 stappen. De eerste stap leest een binaire file in van 10 GB. De output is helaas niet meer binair - minder informatie maar waarschijnlijk meer GB[*]. Stap 2 maakt het weer binair zodat stap 3 het kan sorteren. De output van stap 1 bevat een header (1 regel) die stap 2 niet kan lezen, die moet er dus uit. Mijn pipe ziet er dan zo uit:

Code:
stap1 -i file.bin | sed '1d' | stap2 | stap3 -o file_sorted.bin


Omdat het gaat om veel input duurt dit natuurlijk nogal lang. Ik wil dit allemaal zo snel mogelijk hebben en het enige waar ik invloed op heb is het verwijderen van de eerste regel, wat ik hier met sed doe.

Nu wil ik graag weten hoe sed dit oplost, en of er ook een snellere methode is. Wacht sed tot de hele file beschikbaar is, stap1 dus helemaal klaar is, voordat het begint te rekenen? Of begint sed zodra de eerste byte van de stream binnenkomt? Is er een methode om het verwijderen van de eerste regel sneller te doen, bv met awk of met perl?

Groetjes,
Nikki

[*] de binaire ongesorteerde file is 9.8 GB. De niet binaire versie is 68 GB. Stap 1 filtert er een en ander uit, er blijft ongeveer de helft van de informatie over. De gesorteerde binaire file is 5.2 GB.
Terug naar boven
Profiel bekijken Stuur privébericht
sciurius



Geregistreerd op: 28 Sep 2006
Berichten: 1473
Woonplaats: Exloo

BerichtGeplaatst: Do Jun 03, 2010 9:36 pm    Onderwerp: Re: verwijderen eerste regel van erg lange file Reageren met citaat

NikkiMassa schreef:
Nu wil ik graag weten hoe sed dit oplost, en of er ook een snellere methode is. Wacht sed tot de hele file beschikbaar is, stap1 dus helemaal klaar is, voordat het begint te rekenen? Of begint sed zodra de eerste byte van de stream binnenkomt?

Dat is nu het leuke van unix (en dus ook linux) pipes. In principe[*] zijn deze regel-gedreven. Zodra de eerste regel binnen is kan de pipe aan de gang en wordt het resultaat weer naar de volgende stap doorgegeven. Ik jouw geval is er dus diskruimte nodig van 10GB + 5GB (plus een beetje) maar de 68GB komt niet op disk.
Deze methode om de 1e regel te verwijderen is daarom zeer geschikt en nauwelijks te verbeteren. Ik denk dat de uiteindelijke tijd niet in het verwijderen van de eerste regel zit maar in het sorteren van het zeer grote bestand. Dat kost nu eenmaal tijd...
[*] In de praktijk gaat het met blocks van een paar KB maar dat maakt weinig verschil.
Terug naar boven
Profiel bekijken Stuur privébericht Website bekijken
NikkiMassa



Geregistreerd op: 17 Sep 2006
Berichten: 355
Woonplaats: Vries

BerichtGeplaatst: Vr Jun 04, 2010 9:12 am    Onderwerp: Reageren met citaat

Dankjewel voor je heldere antwoord.

hmm cool, sed gaat dus niet eerst alles inlezen. De programmas die stap 2 en 3 doen zijn in C geschreven, stap 1 is een Java programma. Ik roep deze pipe aan vanuit Java, maar het is natuurlijk nogal stom om dit te doen:
Code:
Process p = Runtime.getRuntime().exec("java -jar blaat.jar INPUT=file.bin", null, wdir);

Nu laat 'blaat.jar' wel tegen zich aankletsen, met enige modificaties.

Is het nu ongeveer net zo snel om stap 1 in mijn programma in te pakken, de output opvangen als (buffered) stream, iets bedenken om de eerste regel over te slaan en dan de stream rechtstreeks naar de pipe te gooien?

De overweging hier is netheid, met alles in 1 commando uit te voeren werkt prima maar is vrij slordig in mijn geval.

Mocht je het weten, graag. Mocht je het niet weten, stop er geen tijd in voor mij hoor.
Terug naar boven
Profiel bekijken Stuur privébericht
sciurius



Geregistreerd op: 28 Sep 2006
Berichten: 1473
Woonplaats: Exloo

BerichtGeplaatst: Vr Jun 04, 2010 1:09 pm    Onderwerp: Reageren met citaat

Wat zou je ervan vinden om het wetenschappelijk aan te pakken.
Neem elk van de stappen en gebruik temporary files. Time deze.
Code:
time stap1 -i file.bin >een
time sed '1d' <een>twee
time stap2 <twee>drie
time stap3 -o file_sorted.bin <drie

Mijn gok ik dat stap3 verreweg het meeste tijd vreet. En dan heeft het zo weinig zin om de eerdere stappen te optimaliseren.
Ook relevant is de vraag: hoe vaak moet je deze pipe uitvoeren? Twee keer voor een project? Elke week? 6 keer per minuut?
Terug naar boven
Profiel bekijken Stuur privébericht Website bekijken
NikkiMassa



Geregistreerd op: 17 Sep 2006
Berichten: 355
Woonplaats: Vries

BerichtGeplaatst: Ma Jun 07, 2010 2:35 pm    Onderwerp: Reageren met citaat

sciurius schreef:
Wat zou je ervan vinden om het wetenschappelijk aan te pakken.

Cool

sciurius schreef:
Neem elk van de stappen en gebruik temporary files. Time deze. [...] Mijn gok ik dat stap3 verreweg het meeste tijd vreet. En dan heeft het zo weinig zin om de eerdere stappen te optimaliseren.

Mijn overweging was dan ook netheid, natuurlijk gaat het meeste tijd zitten in het sorteren (ookal is er een index beschikbaar). Ik begrijp uit je antwoord dat het niet uitmaakt of ik nu de pipe gebruik uit mijn eerste post of dat ik stap 1 + verwijderen 1ste regel implementeer en de stream naar stap2 stuur. Het zal allebei ongeveer evenveel tijd in beslag nemen.

Voor nu laat ik het trouwens even zo, ik heb eerst geen tijd uit te zoeken hoe dat met die streams in zijn werk gaat (hoe je bv een stream naar een commando toe krijgt). De command zoals in mijn eerste post roep ik in zijn geheel aan vanuit mijn class en het werkt.
Terug naar boven
Profiel bekijken Stuur privébericht
Berichten van afgelopen:   
Nieuw onderwerp plaatsen   Reageren    Fedora-Linux.nl Forumindex -> Programmeren en scripten Tijden zijn in GMT + 1 uur
Pagina 1 van 1

 
Ga naar:  
Je mag geen nieuwe onderwerpen plaatsen in dit subforum
Je mag geen reacties plaatsen in dit subforum
Je mag je berichten niet bewerken in dit subforum
Je mag je berichten niet verwijderen in dit subforum
Je mag niet stemmen in polls in dit subforum


Powered by phpBB © 2001, 2005 phpBB Group
Vertaling door Lennart Goosens.