Performant sorteren en uniek maken (160gb)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • hanzer
  • Registratie: September 2007
  • Niet online
Ik heb een folder met een 30-tal bestanden in. Deze bevatten allemaal woordlijsten. De bestanden hebben allemaal een andere extensie (.txt, .lst,...), maar zijn wel degelijk allemaal simpele lijsten.
Het gaat om meer dan 160gb aan data.

Ik wil, als mijn machine het aankan, deze lijst samenvoegen tot 1 lijst (of in het slechtste geval tot 2).

Het sorteren en uniek maken van een bestaande lijst doe ik momenteel met dit:
cat lijst_test.txt | sort | uniq > gesorteerdelijst.txt

Om nu de hele folder te doen wil ik dit gebruiken;
cat * | sort | unique > Sorted_unique_list.txt

Welk commando zouden jullie gebruiken om zo zuinig mogelijk te zijn met resources en dus zo snel mogelijk.
Ik heb inmiddels gelezen dat je het sort commando wel kan tweaken met bv "sort -S 50% --parallel=2 ". Iemand dat hier praktijk ervaring heeft?

Het commando zou dan iets moeten zijn als:
cat * | sort -S 50% --parallel=4 | unique > Sorted_unique_list.txt

Ik zou dit willen uitvoeren op een Windows host met vmware Linux guest. Host heeft 16gb en i7 ter beschikking. Ik heb tijd, als het dagen zou duren, geen probleem. :-)

Is dit het snelste commando?
Misschien nog voortgang tonen met PV?

Acties:
  • +1 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Laatst online: 13:25
Sort heeft al een optie voor unieke records (-u), dat zal vast sneller zijn dan ze er later uitfilteren. Verder UUOC.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Gezien je vraag zou ik eigenlijk gokken dat je met username/password dumps aan het werken bent... licht twijfelachtig of dat legaal is natuurlijk. Maargoed, zonder meer te weten is dat misschien een incorrecte aanname.

Als het iets is wat je 1x moet doen en als je niet teveel haast hebt dan zou ik ook gewoon voor sort gaan, zoveel is 160GB nu ook weer niet gelukkig.

Doe je dit wel vaker dan zou je kunnen overwegen om Hadoop te gebruiken met een MapReduce aanpak. Daarmee kan je het vrij eenvoudig verdelen over veel machines.

Zoals hcQd al zegt kan sort ook direct een unique uitvoeren, dat kan dus al aardig schelen. Maar daarnaast moet je er ook niet vanuit gaan dat alles direct in RAM uitgevoerd kan worden, dus die "-S" parameter moet je voorzichtig gebruiken.

Ik neem overigens ook aan dat je een multiprocessor CPU hebt waarmee je dit heel makkelijk parallel zou kunnen doen. Voor het gemak zou ik het eerst splitsen in kleine (RAM-BESCHIKBAAR / PROCESSORS bijvoorbeeld) bestanden om ze daarna te sorteren en samen te voegen. Door ze op te splitsen in stukken die klein genoeg zijn om parallel in je geheugen te passen kan je alles in RAM doen.

Stel je hebt standaard 12GB beschikbaar van de 16GB ram in je machine en je hebt 4 CPU cores, dan zou ik ze dus splitsen in 12GB / 4 = 3GB
cat al jouw bestanden | split -b 3G - ../partial_files


Daarna kan je de bestanden parallel laten sorteren (GNU parallel werkt hier wel fijn voor) en na afloop doort sort met de -m parameter laten samenvoegen

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 29-09 21:21

Hero of Time

Moderator LNX

There is only one Legend

Andere optie is het in een database te dumpen. Die is wellicht efficiënter en sneller in het vinden van duplicaten. Nog mooier als je maar twee kolommen hebt en je maakt die samen de primary key.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • hanzer
  • Registratie: September 2007
  • Niet online
Ok. ik werk morgen verder aan de unique in sort. Dat spaart weer een pipe.
Nee, geen dumps. Grep lijsten uit een log.

Thx!
Ik post desnoods het uiteindelijke commando nog wel.

Acties:
  • 0 Henk 'm!

  • hanzer
  • Registratie: September 2007
  • Niet online
Deze is het geworden;
cat * | pv | sort -S 70% --parallel=4 -u > out.lst

  • Frenziefrenz
  • Registratie: Juli 2014
  • Laatst online: 23-09 12:15
Dat moet natuurlijk cat ./* zijn. ;) (Zie hier.)

Overigens is het voor je OP als het goed is sneller om gewoon sort -S 70% --parallel=4 -u ./* > out.lst te doen (useless use of cat, je weet toch :P), maar dan heb je geen PV.

P.S. Ik zeg dit alleen maar omdat je specifiek vraagt of iets met een useless cat het snelste commando is. Normaal gesproken is zoiets maar muggenzifterij. :P

Acties:
  • +1 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Sowieso is het useless want pv kan ook bestanden uitlezen en is dan eigenlijk nog slimmer omdat hij weet hoe groot het is ;)

pv ./* | sort -S 70% --parallel=4 -u > out.lst

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Frenziefrenz
  • Registratie: Juli 2014
  • Laatst online: 23-09 12:15
Ik weet dat pv bestaat maar heb het niet standaard geïnstalleerd. Ik dacht dat het enkel op pipes werkte vanwege de naam. Maar voor simpel gebruik blijkt het idd een drop-in replacement te zijn. :)

https://linux.die.net/man/1/pv
pv will copy each supplied FILE in turn to standard output (- means standard input), or if no FILEs are specified just standard input is copied. This is the same behaviour as cat(1).
Pagina: 1