| ° Forum ° Odpowiedz ° Rejestracja ° Szukaj ° | |
| Giełda samochodowa ° Numizmatyka - monety ° Poznań serwis Mercerdes ° Internetowa Auto giełda ° |
| Forum / php / Operacje na wielu plikach na raz |
| Autor | Wiadomość |
| Latet
|
Posted: 30 Wrz 2008 18:56:05 Witam, Musze zrobić coś, co w uproszczeniu mogę przedstawić tak: jest wielki plik tekstowy (50MB, parę milionów wierszy), każdy wiersz zawiera jedno słowo. Skrypt ma "przelecieć" ten plik od początku do końca, odczytać każdy wiersz po kolei i przepisać słowa to kilkudziesięciu plików - tak, że słowa rozpoczynajace się na literę "a" idą do pliku "a.txt", słowa na litere "b" do pliku "b.txt", itd... I tyle. Aha - to wszystko będzie się wykonywać tylko na localhoscie, raz na wiele dni. Niby proste, ale... tych plików wynikowych ma być około 100 (słowa są w kilku różnych alfabetach). Czy można otworzyć do zapisu aż tyle plików na raz? Czy można sprawdzić, czy plik o danej nazwie jest już otwarty, jakiś odpowiednik file_exists() ? Czy można zamknąć jednym fclose() wszyskie pliki otwarte na raz, nie podając ich nazw? Albo inaczej - po odczytaniu każdej kolejnej lini z pliku źródłowego (przypomnę że są ich miliony), otworzyć właściwy plik wynikowy, zapisać słowo, zamknać plik wynikowy, i tak w kółko? Na pewno taka wersja prostsza do napisania jest, ale nie wiem czy silnik PHP nie dostanie kota od milionów fopen() / fclose() pod rząd... Co radzicie? Dzięki, latet |
| Jacek Karczmarczyk
|
Posted: 30 Wrz 2008 18:59:32 Co radzicie?
Może najpierw przelecieć sortem? |
| Latet
|
Posted: 30 Wrz 2008 19:37:18 Co radzicie?
Może najpierw przelecieć sortem? Hmmm.... to mogę zrobić bez najmniejszego problemu (EditPlus sortuje takie wielkie pliki szybko i sprawnie). Jesli plik posortowany będzie, to... rzeczywiście już jakby bardziej z górki. (hmmm.... wlasciwie to mogę go ręcznie podzielić na te kawałki :-) Dzięki, latet |
| Paweł Andziak
|
Posted: 30 Wrz 2008 23:01:49 Silnik PHP nie dostanie kota - jest bardzo sprawny, ale
operacje na milionach linii zmierzą się chyba z limitem czasu wykonywania skryptu. PHP nie trzeba odpalac przez WWW. Pisalem skrypty PHP-CLI, ktore chodzily bez problemu kilkadziesiat godzin. Ale bashem to mozna faktycznie szybciej zrobic, np: ### cut ### #!/bin/bash for slowo in `cat slownik.txt` do plik=`echo "${slowo}" | egrep -o "^.{1}"`".txt" echo "${slowo}" ${plik} done ### cut ### 109852 slownik.txt real 7m55.337s user 3m14.860s sys 4m13.112s 2351 a.txt 3293 b.txt 2935 c.txt 5372 d.txt 2143 e.txt 2289 f.txt 3198 g.txt 1883 h.txt 2166 i.txt 1651 j.txt 7177 k.txt 2819 l.txt 4704 m.txt 5644 n.txt 6566 o.txt 16441 p.txt 561 q.txt 5156 r.txt 10012 s.txt 3455 t.txt 3991 u.txt 7 v.txt 8359 w.txt 2 x.txt 7 y.txt 7670 z.txt 109852 razem |
| Latet
|
Posted: 1 Paź 2008 06:09:45 Silnik PHP nie dostanie kota - jest bardzo sprawny, ale
operacje na milionach linii zmierzą się chyba z limitem czasu wykonywania skryptu. Jak wspomnialem na wstępie - to ma dzialac tylko na moim localhost (Windows), gdzie problem limitu czasu nie istnieje, a pamięci na pewno nie zabraknie. Dziękuję, latet |
| Latet
|
Posted: 1 Paź 2008 06:13:04 plik=`echo "${slowo}" | egrep -o "^.{1}"`".txt"
echo "${slowo}" ${plik} Chyba aż tak prosto z tym egrep to nie, bo to wszystko jest w UTF-8, więc nie tylko pierwsze litery słów mogą mieć różną długość w bajtach, ale też zapewne nie koniecznie powinny być umieszczane w nazawach plików. Pewnie użyję funkcji z rodziny mb_string, a nazwy plików będą kodami tych liter. Nie wiem tylko jeszcze czy mają to być kody Unicode, czy jakoś inaczej. Dzięki, latet |
|
Czas ładowania strony (sek.): 0.430 users miniBB.net © 2001-2008 | Polityka Prywatności e-giełdy + opisy gg + kumy fubi ° oko na maroko ° nimda °
|