Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Projekt ale czy w PHP?
Forum PHP.pl > Inne > Hydepark
marbi
witam,
mam prawie gotowy projekt tworzenia plików na serwerze, skrypt pobiera dane z formularza ok (30 pól) i generalnie tworzy mi 500 katalogów w kazdym po 2 pliki, nazwy generuje losowo. Zajmuje to około 30 sekund.
2 tygodnie temu otrzymałem informację, że jest ktoś zainteresowany tym skryptem ale ma mu utworzyć 1000 katalogów w każdym po 1000 plików a do tych 30 pól ma pobierać dane z 5 plików tekstowych każdy po 25K linii.
Obecnie jest jedna strona i dane są wprowadzane na tej jednej stronie po wprowadzeniu jest przycisk SUBMIT i czekam na efekt w postaci plików. Nie ma żadnej bazy wszystko odbywa się tylko przy użyciu pól formularza.
Nie mam takiego doświadczenia, żeby stwierdzić czy PHP nadaje się do takiej pracy czy może lepiej napisać to w Javie. Jak w PHP to jak to optymalnie rowzwiązać, żeby takie generowanie nie zajęło mu za dużo czasu i nie rozłożyło serwera smile.gif
Dziękuję za podpowiedzi
markonix
Może w Bashu?
zegarek84
zależy jaki serwer - tzn. z poziomu konsoli php ma mniejsze ograniczenia - jednak, jeśli tu mowa o formularzu, to zapewne wywoływane przez serwer... ale każde wywołanie można by traktować jako osobny wątek a samo wielokrotne wywołanie formularza np. z poziomu php ale wywołanego z konsoli (da się inaczej robić rozsądne demony ale po co się bawić) i tu hasła padną curl (oczywiście, można to rozłożyć na sockety....), chyba, że logikę aplikacji rozłożysz, że od razu ma sporcjować i obrobić dane...

ogólnie całość może potrwać, czy da się przyśpieszyć to to wszystko zależy od tego, jak optymalnie masz to napisane gdyż gdy już zaprzągniesz php do pracy to nie jest takie wolne... a pliki te czasem nie wczytuj w całości do pamięci (fakt, nie wiem jak długie te linie ale...), ogólnie spróbuj napisać to zdarzeniowo, ale ogólnie wygenerowanie 1000.000 plików raczej trochę zajmie - w sumie nie wiem po co piszę gdyż mogę tylko próbować ogólnie doradzić choć pisałem trochu też pod C++ i JAVA ale nie jestem programistą...
marbi
Cytat(markonix @ 25.10.2012, 01:29:10 ) *
Może w Bashu?

moim zdaniem Bash jest wolny i trudno będzie dalej rozwinąć w nim projekt, myślę na wypadek gdyby osobnik zechciał go rozbudować o jakieś inne funkcje
nie lepiej w takim przypadku zastosować PERL zamiast bash'a?
Nie miałem za duzo doświadczenia z PERL ale mam kilka skryptów, które przepisałem z bash'a gdzie wykonują się po 10 sekund kiedy bash to robi w około minutę, skrypty generują z bazy danych linie po 250 znaków każda w sumie 4000 linii
Łukasz Piotr Łuczak
Tutaj wąskim gardłem będzie podsystem wejścia/wyjścia. PHP jest w zupełności wystarczającym narzędziem. Rzekłbym nawet, że jest narzędziem aż nadto dla takiego zadania.

Tutaj trzeba by po pierwsze pomyśleć o optymalizacji. Przydałaby się tutaj znajomość zagadnień z systemów operacyjnych, działania systemu plików. Uwierz, że znaczenie dla systemu operacyjnego ma nawet fakt czy najpierw tworzysz katalogi a potem w nich pliki, czy też najpierw pliki a potem katalogi.

Przychyliłbym się do sugestii zegarek84 by zrobić to zdarzeniowo ewentualnie mechanizm phase division. W PHP'ie możnaby to wykonać jako kolejkę zadań do wykoniania i prosty cron, który się tym zajmie.
erix
Cytat
W PHP'ie możnaby to wykonać jako kolejkę zadań do wykoniania i prosty cron, który się tym zajmie.

Po kiego pisać coś, co już istnieje? Gearman, Celery.
Łukasz Piotr Łuczak
@erix: korzystałeś z któregoś z tych rozwiązań?
erix
To są zwykłe demony, które kolejkują żądania do wystartowanej puli procesów workerów albo je spawnują co żądanie.

Masz kolejkę, priorytety, wszystko sprowadza się do edycji konfiguracji i ustawienia poleceń wykonywanych w kolejce.

PS: Jest rozszerzenie do PHP, które nieco upraszcza dodawanie do kolejki: http://gearman.org/index.php?id=gearman_php_extension
Wykrywacz
Php się nadaje do tego jak wszystko inne...

Ja pod kątem optymalizacji, to bym podzielił to na wątki np. po 250 katalogów na każdy i sru. Dodajesz fajny loader i po sprawie.
zegarek84
Cytat(Wykrywacz @ 25.10.2012, 16:00:18 ) *
Ja pod kątem optymalizacji, to bym podzielił to na wątki np. po 250 katalogów na każdy i sru. Dodajesz fajny loader i po sprawie.

tja jasne ;] 1000.000 / 250 = 4000 wątków ;p - i niech se wszystkie konkurują a rdzeni załóżmy masz np. 8 ^^, samo przełączanie między wątkami przy konkurencji też będzie mało optymalne, najoptymalniej napisać to zdarzeniowo nawet jeśli przy wykorzystaniu wątków - w C++ jest napisana fajna biblioteka ASIO, włączona także do BOOST, czyli BOOST.ASIO - nie chce mi się rozpisywać co i jak ale nie można nadwyraz próbować obciążać maszyny jeśli to i tak nie będzie optymalne ^^...

wszyscy zaczęliście doradzać, by optymalizować to pod kontem wątków, bądź rozdzielać tak jakby to było na jakimś klastrze (może jeszcze MPI doradzić ;D) - przecież nic nie było wspomniane jaką maszyną dysponuje jego klient...
cepa
popieram poprzednikow, soft typu gearman i masz problem z glowy, obadaj sobie ten przyklad:
http://gearman.org/index.php?id=php_-_mail_queue
ogolnie dodasz sobie np: tysiac zadan aby przerobic kazdy katalog i po problemie,
imho kwestia tego czy to php czy inna technologia jest w tym przypadku pomijalna
xdev
Cytat
Ja pod kątem optymalizacji, to bym podzielił to na wątki np. po 250 katalogów na każdy i sru. Dodajesz fajny loader i po sprawie.

No niezła optymalizacja, nie dość, że zarżniesz I/O to jeszcze CPU (jak ostatnio sprawdzałem dyski nie miały 250 niezależnych głowic a procesory 250 rdzeni). Jeszcze w PHP, czyli do uruchomienia takiego potworka będzie potrzebne z 4GB ramu wink.gif

Cytat
Po kiego pisać coś, co już istnieje? Gearman, Celery.

Gearman do takiego projektu smile.gif No coraz lepiej wink.gif

Uruchomić 250 wątków, przepuścić milion operacji przez dodatkową warstwę abstrakcji... może lepiej od razu po tworzeniu każdego pliku zrobić sleep(1) wtedy będzie najwolniej smile.gif
cepa
Cytat(xdev @ 27.10.2012, 12:07:26 ) *
Gearman do takiego projektu smile.gif No coraz lepiej wink.gif


instalacja (na dedyku) jest prosta, a uzycie wrecz trywialne, wiec czemu nie? imho najszybszy sposob na rozwiazanie tego problemu tongue.gif
xdev
No ok, ale problem od tej strony niczego specjalnego ani skomplikowanego nie wymaga. Jeden prosty insert, jeden select i jeden update w SQL. Tak trochę bez sensu dokładać moduł i komplikować instalację, żeby 3 linijki SQL-a zamienić na 3 linijki odwołań do Gearman.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.