Avatar billede sw_red_6 Nybegynder
30. april 2007 - 14:14 Der er 20 kommentarer og
1 løsning

Oprettelse af MANGE filer på en gang, næsten

Jeg har fået til opgave at lave et script som kan generer en fil ud fra informationer hentet i en database..

Det har jeg så fået lavet, problemet er bare at scriptet finder gennemsnitligt 2000 rækker pr. måned og hver række repræsenterer en fil..

Er der en hurtigere og mere elegant måde at lave det end ved at bruge fopen(), fwrite() og fclose ca. 2000 gange?

Jeg vil godt have lidt hjælp til det for i øjeblikket får det PC til at gå ned, hvilket absolut ikke er optimalt...
Avatar billede intenz Novice
30. april 2007 - 14:49 #1
Om der er andre måder at gøre det på kommer lidt an på hvad du skal bruge de filer til. Hvis filerne _skal_ oprettes, ja så skal de jo oprettes.

Ellers kan du bruge mod_rewrite så det bare ser ud som om de er oprettet uden de ligger som reelle filer.

For at undgå din computer går ned kan du måske med fordel gøre så scriptet kører:
sleep(1);

efter hver 100 filer der er oprettet (eller 200 eller hvad du nu vil). Det går at computeren lige kan slappe af 1 sekund inden den kører videre.
Avatar billede sw_red_6 Nybegynder
30. april 2007 - 15:37 #2
hmm de skal skrives til disken eftersom de skal brændes på cd-rommer og sendes til vores kunder...

Det med at bruge sleep() havde jeg ikke lige tænkt over, men det kunne være en ide..
10-20 sekunder fra eller til kan vel ikke skade når det i forvejen tager ca. 180 sekunder... pr. måned, altså
Jeg skal så bare huske at sætte execution time op så der er tid til at scriptet kan køre færdigt, men det vil jeg forsøge
Avatar billede jakobdo Ekspert
30. april 2007 - 19:15 #3
sleep(1); betyder scriptet sover i 1 sekund!
Så vi snakker 2000 sekunder = 33 minutter og 20 sekunder!
Måske du skal kigge på usleep() som kører med millisekunder.
Avatar billede intenz Novice
30. april 2007 - 20:28 #4
Ideen var at lave en lille $count inde i while koden, så hver gang den når 100 (f.eks) ville det lave sleep(1); og nulstille $count.
Så er det kun 20 sek. ;)
Avatar billede jakobdo Ekspert
30. april 2007 - 20:37 #5
Jaja, jeg skal jo bare læse det der står med små bogstaver! :op
Avatar billede intenz Novice
30. april 2007 - 20:38 #6
;)
Avatar billede jakobdo Ekspert
30. april 2007 - 20:53 #7
Men en usleep mellem alle fil oprettelser ville måske ikke være en dum ide heller.
Avatar billede intenz Novice
30. april 2007 - 22:14 #8
Nej, bestemt ikke
Avatar billede sw_red_6 Nybegynder
01. maj 2007 - 09:06 #9
hmm så hvis jeg sætter en usleep(1) ind efter hver filoprettelse vil den have ca. 19.000 millisekunders pause for hver kunde, med nogle kunder vil der endda være flere filer der skal skrives..

Jeg prøvede med den sleep(1); men jeg kan ikke køre scriptet flere gange uden PC får et flip og skal genstartes.. kan der være nogen vej udenom dette?
Avatar billede intenz Novice
01. maj 2007 - 17:12 #10
Det kommer an på hvad 'får et flip' betyder :)

En anden løsning kunne være at lave en form for sideskift. Så den kører f.eks. 10 kunder igennem og bagefter udskriver en side der indeholder noget ligende:
<meta http-equiv="refresh" content="2;url=fil.php?start=10">

Det er så browseren der skifter side og fortsætter med de næste 10 kunder efter 2 sekunder.

Det kræver selvfølgelig at du kører scriptet i en browser.
Avatar billede jakobdo Ekspert
01. maj 2007 - 17:52 #11
Er det ikke for ustabilt at køre et "produktion" som er afhængig af meta - refresh og en browser?
Så ville jeg hellere køre et cronjob, som kører det i bider, og evt. gemmer position i en fil eller database.
Avatar billede sw_red_6 Nybegynder
02. maj 2007 - 13:58 #12
får et flip betyder at PC mister net-forbindelse, kan ikke starte en ny tab i IE7, kan ikke vise joblisten når jeg trykker ctrl-alt-delete, apache-serveren svarer ikke og kan ikke genstartes, ditto for mysql og det eneste der kan gøres ved det er en genstart af PC...

og det er ikke sådan at jeg kører X antal kunder lige efter hinanden.. Det er lavet så man skal ind og vælge start- og slut-måned, år og kunde inden man kan generere filerne
Avatar billede sw_red_6 Nybegynder
10. maj 2007 - 12:38 #13
Jeg har fundet ud af at PC fik et flip pga memoryleak i de funktioner Apache2 bruger på winblows platform...

det med at indsætte den sleep(1) har i hvert fald gjort det en del nemmere at have med at gøre, selvom det tager en del længere tid

Hvis der bliver lagt et svar fra intenz får han pointene.. i hvert fald en del af dem

Hvis jakobdo kan komme med udregning på hvor lang tid det vil tage hvis jeg bruger en usleep(1) efter hver fil overvejer jeg gerne om den løsning skal bruges.. Det er ca 20.000 filer der skal oprettes, så hvor mange sekunder vil det blive til? (min hjerne er gået på strejke tror jeg)
Avatar billede jakobdo Ekspert
13. maj 2007 - 18:59 #14
20000 microsekunder = 0,02 sekunder
Avatar billede sw_red_6 Nybegynder
14. maj 2007 - 10:07 #15
hmm det er tidsmæssigt bedre, men har det den samme effekt som en sleep(1) for hver 200 filer?
Avatar billede jakobdo Ekspert
14. maj 2007 - 10:24 #16
sleep() mener jeg er i sekunder.
Så nej!
Avatar billede sw_red_6 Nybegynder
14. maj 2007 - 11:52 #17
sleep() er i sekunder.. men jeg ville vide om det ville være lige så effektivt at sætte en usleep(1) ind efter hver filoprettelse, som hvis jeg satte en sleep(1) ind for hver 200 filoprettelser

Eller var forslaget at den skulle sættes ind _sammen_ med sleep(1)?
Avatar billede sw_red_6 Nybegynder
07. august 2007 - 10:26 #18
Jeg har fået lavet en løsning som virker så hvis jeg kan få et svar fra jer begge kan jeg få lukket her..
Avatar billede jakobdo Ekspert
07. august 2007 - 10:56 #19
Svar!
Avatar billede sw_red_6 Nybegynder
27. september 2007 - 08:48 #20
hmm, mangler vidst stadig er svar fra intenz..
Avatar billede jakobdo Ekspert
31. oktober 2007 - 08:59 #21
JEg takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester