Autor Zpráva
niCe
Profil
Ahoj, řeším následující problém: mějmě 16.000 souborů (každý okolo 100b). Pokud uděláme skript, který postupně projde všechny soubory, otevře je pomocí fopen a přečte pomocí fread a vyhodnotí je, je to pomalé, a ta operace většinou končí za 30 sekund obligátní hláškou maximum time exceeded...
Čím to, že ta operace je tak výpočetně náročná? Je vytíženej server? Otevírání souborů je pro php složité? Zkoušel jsem jak rychle php provádí jednoduchý cyklus, a v tom problém není, brzdí to jen ta fopen a fread...

Protože v těch souborech dělám vyhledávání, potřebuju je procházet tak, aby se ten skript vykonal do 10-15 sekund. Je to vůbec při těch 16.000 souborech možné?

Zkrátka potřebuju nakopnout tím správných směrem, abych mohl udělat efektivní vyhledávací skript.

Předem díky za každou radu, niCe
Mastodont
Profil
Pokud není zapnut safe mode, tak se dá použít set_time_limit() , ovšem to je velmi mizerné řešení.

Já bych těch 16 000 souborů převedl do databáze nebo sloučil do větších souborů.
Mireczech
Profil
Uplne nejjednodussi by bylo toto vyhledavani nechat na DB.

Jen pro zajimavost, napsal jsem program v C, ktery otevre 16000 souboru, precte je a vypise na vystup (presmerovany do souboru).

real 0m1.732s
user 0m0.490s
sys 0m1.237s

V PHP se mi to psat nechtelo (za posledni tyden ho mam plne zuby), navic proc psat neco co si muzes otestovat sam. Zkus jak dlouho trvaji jednotlive faze (jen prazdny cyklus, cyklus jen s oteviranim souboru, cyklus s otevrenim a nactenim, s otevrenim nactenim a zpracovanim).

Pokud bude problem hned s oteviranim, tak s tim nic neudelas a budes to muset prepsat nad DB

(tim freadem to nacitas po kolika B?).
tiso
Profil
No, ono ide o to, ako máš spravené to načítanie súborov... Dá sa to inak rozdeliť do dvoch krokov: prehľadať adresár a názvy súborov uložiť do jedného súboru a v druhom kroku načítavať súbory podľa týchto názvov.
Iná cesta je spracované súbory presúvať/mazať z pracovného adresára a presmerovávať na rovnaký skript, už sa to tu riešilo 2x tento mesiac...
niCe
Profil
Mam jeden soubor, kde mam seznam čísel, podle kterých otevíram ty soubory jeden za druhym.

summary.dat je tedy neco jako 11786957423Đ1178945789Đ117 ... atd. Podle toho pak otevru soubor folder/$x.dat

V tom skriptu mam cyklus, který právě 16.000 otevře vždy jednotlivý soubor folder/$x.dat pomocí fread a fopen. Zkoušel jsem i file_get_contents, ale ten vůbec rychlejší není. A protože to skutečně brzdí to otevírání souborů, budu muset, jak jste už psali, převést ta data do DB nebo do jednoho většího souboru, který se otevře jednou a tudíž nezdržuje (provádí se pak sice více cyklů, ale ve výsledku to nijak nezpomaluje).

Takže díky všem za rady, moc jste mi pomohli, jdu to hned předělat :)
Ale ještě mi prosím vás vysvětlete proč to otevírání souborů tak brzdí ten výpočetní cyklus? Vždyť se to provádí na serveru.. Mam vynadat hostingu za pomalé nebo přetížené stroje?

Díky, niCe
niCe
Profil
Mireczech
Fread načte vždy tak 100-150 bytů, což tedy není žádná katastrofa. Takže bych spíš tipoval, že to brzdí fopen..
tiso
Profil
niCe - db je riešenie, netuším čo v ých súboroch vlastne máš. Ale ide to i bez toho - proste načítaš summary.dat, spracuješ 10 alebo 100 súborov a tých 10 alebo 100 súborov zmažeš z toho summary.dat a presmeruješ skript opäť sám na seba...
piszta
Profil *
presunuti na db je samozrejme krok spravnym smerem, ale k dotazu: problem bych mozna videl i v mnozstvi souboru v jedinem adresari, zalezi na pouzitem FS na serveru

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0