Hov. Du er ikke logget ind.
DU SKAL VÆRE LOGGET IND, FOR AT INTERAGERE PÅ DENNE SIDE

CPU of RAM brug på server ????

Side 1 ud af 2 (14 indlæg)
Tilmeldt 27. Oct 13
Indlæg ialt: 6
Skrevet kl. 00:04
Hvor mange stjerner giver du? :

Jeg faldt lige over denne side

http://textmechanic.com/Remove-Duplicate-Lines.html

her kan du indsætte en text og denne online service fjerner så linjer der er ens. Super smart.

Her er mit spørgsmål. Hvis jeg nu indsætter en tekst med 10 millioner linjer, og beder serveren om at fjerne linjer der er ens. Vil dette arbejde så tage mest på ram eller cpu ?

Jeg tænker på denne service konkret, og ikke generalt. Jeg tænker at det må være cpu arbejde, men jeg er langt langt fra sikker. Jeg ved at man selvfælgelig kan teste dette, men har brug for noget information om det FØR jeg vælger at bruge penge på enten cpu eller ram.

på forhånd tak for hjælpen.

Tilmeldt 17. Jul 12
Indlæg ialt: 2178
Fra  PerfGrid Skrevet kl. 02:28
Hvor mange stjerner giver du? :

Den vil selvfølgelig bruge noget CPU for at finde alle de ting den nu skal fjerne, men hvis koden er skrevet dårligt, så vil du bruge en del buffer for dataen, så jeg vil skyde på at der vil blive brugt en del ram.

PerfGrid - High performance webhoteller. Kvalitet i næste kaliber.

Fra Søborg
Tilmeldt 13. Dec 10
Indlæg ialt: 274
Skrevet kl. 08:31
Hvor mange stjerner giver du? :

Det er umuligt at give et konkret svar på. Det kommer 100% an på hvordan den bliver implementeret.

Jeg kan prøve at give dig en ide om hvor mange recurser der skal bruges som minimum med en god implementation. Bemærk jeg bruger runde tal ved godt det ikke er 100% præsist.

Du har 10 millioner linjer tekst. Jeg vil vælge at antage at der er gennemsnitlig 250 tegn i en linje. Det giver i alt cirka 2.500.000.000 eller 2,5 mia tegn. Nu er vi så heldige at langt de fleste normale engelske tegn (a-z,0-9 osv) bruger 1 byte i ASCII som er standarten. Det giver os igen 2.5 mia bytes eller omkring 2,5 GB. Det vil sige at hvis vi bare smidder alt meneingsløst ind på ramne bruger vi rundt regnet 2,5 GB. Det behøver vi nu ikke men desto størrer del af dataen ligger op harddisken desto længere tid skal vi bruge på at flytte data fra haddisk til ram hvilket er et problem da man læser langsommere fra haddisken end fra ram. Hvis vi skal optimere i forhold til cpu skal vi altså have 2,5 GB ram til rådighed som minimum men du kan i pricippet bruge meget mindre så køre programmet bare langsommere. Det skal dog siges at hvis vi laver en dårlig implementation vil det dog kræve flere ram.

Hvor lang tid tager koden så at køre? Det kommer an på en masse ting så som CPU, styresystem mm. Det er dog realistisk at finde ud af hvor mange gange vi skal sammenligne 2 rækker og hvis vi ved hvor lang tid det tager så har vi et godt estimat. Den lette løsning ville være at sammenligne alle de forskellige rækker med hinanden og så fjerne dem der er ens. Worst case er der ingen der er ens og vi ender derfor med at lave 10.000.000^2 sammenligninger eller 100.000.000.000.000 eller 100.000 mia gange. Vi kan dog gøre det hurtigere. Hvis vi sortere dataen først så kan vi f.eks. nøjes med 10 mil sammenligninger. Sortering tager dog tid. Uden at gå for meget i detaljer vil jeg afsløre at det gøres i bedste fald med det vi i IT verdnen kalder worstcase køretid n*log(n) hvor n er antallet af data eller i dette tilfælde linjer. Det betyder at vi skal tage 10 mil * 2 tals logeritmen til 10 mil. 2 tals logeritmen til 10 mil er cirka 22 så omkring 220 mil + de 10 = 230. Her er mit gæt så dog at du skal lægger omkring 40 mb til ramforbruget hvis du gerne vil have linjerne ud i den samme rækkefølge foruden potetielt 220 mil ekstra oprationer. Hvor lang tid tager det så at sammenligne og flytte 2 linjer. Tja ikke særlig lang tid men det kræver at man forsøger sig frem for der er massere af ubekendte. Hvis vi nu antager at det tager cirka 0,00001 sek. (tror ikke det er helt urealistisk med 0,01 millisekund) så vil vi altså bruge op til 230 mil * 0,00001 s eller 2300 sekunder for at få alle linjerne ud i sorteret orden og 4500 sekunder for den oprindelige orden. Dette giver os et rundt estimat på hhv 38,333 min og 75 min. Mere hvis du mangler ram. Hvis du programmere godt og har flere kerner osv. kan du selvfølgelig få det her ekstra ned.

Hvad er konklusionen så? Jeg tror jeg ville kigge på serveren og se hvor mange ram der er. Hvis du har mere end 8 GB ram så ville jeg nok gå klart efter processerkraft ved mindre end du brunger serveren til andre hårdre ting. Hvis du har mindre end 4 GB ville jeg helt sikkert gå efter ram. Mellem de 2 ved jeg ikke helt hvad jeg ville vælge. Alternativt kan du jo teste din server. Jeg ville nok se hvor lang tid det tager i dag og hvor fyldte ramne bliver når jeg sætter den igang med nogle lidt mindre testopgaver. Her ville jeg nok starte med at give den f.eks. 10.000 linje og så 100.000 linjer, 1.000.000 mil linjer og så 10.000.000 linjer for at se hvad der sker. Du kan overvåge processor og ram forbrug på serveren i mellemtiden. Hvis rammene bliver fyldt op ville jeg skaffe flere af dem først.

Prøv en gratis personlighedstest på coreprofile.com

Fra Hellerup
Tilmeldt 11. Apr 06
Indlæg ialt: 3722
Fra  CloudSprout Skrevet kl. 10:04
Hvor mange stjerner giver du? :

Der er meget rigtigt i det Asger siger, men det kan laves lidt smartere. Ved at bruge en Hash funktion (http://da.wikipedia.org/wiki/Hashfunktion) og kun gemme hashen og lokationen af linien, så vil det gå markant hurtigere og fylde mindre.

Hvis vi f.eks. hash'er ned til ti tegn, så vil det samlede ram forbrug være en femogtyvende-del, altså ca. 100 mb. I forhold til køretiden, kan vi ved at putte gemme linierne i en hashtabel opnå en kørertid på N. Altså omkring en 10.000.000 gennemløb.

Rent CPU og Ram mæssigt vil jeg ikke tro at det kræver noget særligt, de fleste maskiner der er indkøbt indenfor de sidste par år, ville jeg tro kunne klare det rimeligt hurtigt, den bedste måde at finde ud af det på er at lave et lille program der laver noget test data og udfører opgaven. Jeg ville tro at det kunne gøres på en halv til en hel time.

Fra Søborg
Tilmeldt 13. Dec 10
Indlæg ialt: 274
Skrevet kl. 11:37
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person

Lundsby:
Der er meget rigtigt i det Asger siger, men det kan laves lidt smartere. Ved at bruge en Hash funktion (http://da.wikipedia.org/wiki/Hashfunktion) og kun gemme hashen og lokationen af linien, så vil det gå markant hurtigere og fylde mindre.

God pointe. Du skal dog være opmærksom på at det kan give falske positive selvom det i praksis er usandsynligt. Det er også meget let at fjerne efterfølgende da det bare kræver at du køre sammeligningerne igen med den rigtige data.

Lundsby:
Hvis vi f.eks. hash'er ned til ti tegn, så vil det samlede ram forbrug være en femogtyvende-del, altså ca. 100 mb. I forhold til køretiden, kan vi ved at putte gemme linierne i en hashtabel opnå en kørertid på N. Altså omkring en 10.000.000 gennemløb.

Nej ikke helt korekt. Du glemmer at når du lægger den ind i hashtabellen skal de sorteres. Det sker automatisk men påvirker stadig din køretid. Sorteringer kan mig bekendt ikke ske hurtigere end n*log(n). Hvis du kan lave en sortering hurtigere end det så er jeg sikker på at der ligger 1 billet til stockholm og venter sammen med en lille medalje ;) Derudover tror jeg meget gerne DTU vil tale med dig for så har du lige modbevist en masse jeg har lært gennem min studietid.

Prøv en gratis personlighedstest på coreprofile.com

Tilmeldt 17. Jul 12
Indlæg ialt: 2178
Fra  PerfGrid Skrevet kl. 12:35
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person

Nu brugte jeg tiden på at lave en fil, med duplicate lines, i alt 30 millioner linjer, og en fil størrelse på 3 gigabyte.

ved brug af en helt normalt 'sort tmpfile | uniq' i linux resultere i et ram forbrug af 90.4 megabyte, tiden var 2 minutter og 54 sekunder.

Ved brug af Python, tager det 2.5 megabyte ram, med følgende kode:

lines_seen = set()
outfile = open("unikt", "w")
for line in open("megetstor", "r"):
if line not in lines_seen:
outfile.write(line)
lines_seen.add(line)
outfile.close()

Dette tager 34.3 sekunder for samme fil.

Ved brug af følgende kode:

from collections import OrderedDict

with open('megetstor') as fin:
lines = (line.rstrip() for line in fin)
unique_lines = OrderedDict.fromkeys( (line for line in lines if line) )

print unique_lines.keys()

Denne tager 3.8 megabyte ram, og tager 1 min 40.313 sekunder.

Så kan skam gøres relativt hurtigt, og ved lavt forbrug ;)

PerfGrid - High performance webhoteller. Kvalitet i næste kaliber.

Tilmeldt 27. Oct 13
Indlæg ialt: 6
Skrevet kl. 13:37
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person

1000 tak til jer alle sammen for fantastisk feedback.

Lucas jeg syntes det er fantastisk at du har taget dig tiden til rent faktisk at teste.

Hvis pyhton kører 30 millioner linjer på 34.3 sekunder, med så lidt ram, kan man så lave en løsning hvor koden læser fra flere forskellige punkter på samme tid ?

Ekesmpeltvis at filen læses fra hver 5million linje. I dette tilfælde fra 6 forskellige steder på samme tid.

Vil det kunne presse tiden ned på omkring 1-2 sek for den samme fil ???

Tilmeldt 17. Jul 12
Indlæg ialt: 2178
Fra  PerfGrid Skrevet kl. 13:42
Hvor mange stjerner giver du? :

samuelsen:

1000 tak til jer alle sammen for fantastisk feedback.

Lucas jeg syntes det er fantastisk at du har taget dig tiden til rent faktisk at teste.

Hvis pyhton kører 30 millioner linjer på 34.3 sekunder, med så lidt ram, kan man så lave en løsning hvor koden læser fra flere forskellige punkter på samme tid ?

Ekesmpeltvis at filen læses fra hver 5million linje. I dette tilfælde fra 6 forskellige steder på samme tid.

Vil det kunne presse tiden ned på omkring 1-2 sek for den samme fil ???

Du kan bruge noget map reduce, men er lidt mere kompliceret end koden ovenfor :)

PerfGrid - High performance webhoteller. Kvalitet i næste kaliber.

Fra Hellerup
Tilmeldt 11. Apr 06
Indlæg ialt: 3722
Fra  CloudSprout Skrevet kl. 14:57
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person
Hej Asger
Jeg syntes jeg har snakket nok med DTU da jeg tog min kandidat grad derude :-)
Men jeg tror heller ikke at der er nogle derude som ville blive overrasket over at det ikke kræver en sortering at indsætte i en hashtabel. Hvor har du det fra ?

(Iøvrigt er Pythons Set implementeret via en Hashtabel)
Fra Søborg
Tilmeldt 13. Dec 10
Indlæg ialt: 274
Skrevet kl. 12:24
Hvor mange stjerner giver du? :
Gennemsnit 5,0 stjerner givet af 1 person

Lundsby:
Hej Asger
Men jeg tror heller ikke at der er nogle derude som ville blive overrasket over at det ikke kræver en sortering at indsætte i en hashtabel. Hvor har du det fra ?

Det ville give mening. I øvrigt kan jeg ikke se hvordan den skulle have en køretid på n hvis ikke den er sorteret. Hvis de ligger tilfældigt kan jeg ikke se hvordan du får en køretid der er bedre end n^2 ved mindre du bruger n*log(n) på at sortere dem. Hvis nogen kan forklare mig det så giver jeg sku en god øl eller en flaske vin. Pt strider det mod alt jeg (tror jeg) har lært i DTU's ellers gode kursus algoritmer 1.

Prøv en gratis personlighedstest på coreprofile.com

Side 1 ud af 2 (14 indlæg)