Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Proszę o poradę: Dużo plików w jednym katalogu czy grupowanie ich w katalogach
Forum PHP.pl > Forum > PHP
Sztef89
Proszę o doradzenie jak lepiej zrobić:

Mam masę plików o nazwach:
dsaf3jkbcs.1.jpg
dsaf3jkbcs.3.jpg
dsaf3jkbcs.4.jpg
...
4jb5kn53jj.1.jpg
4jb5kn53jj.3.jpg
4jb5kn53jj.4.jpg
...
itd.


Zastanawiam się jak lepiej zrobić aby strona chodziła wydajniej (zakłądając ze tych plików może być nawet 1000000).

1. Pliki umieścić w jednym katalogu, a żeby je wyświetlić to:
  1. $warunek = '../img/obrazki/'.$id.'*';
  2. $tmp = glob($warunek);
  3. potem w pętli odczytujemy pliki...


CZY

2. Pliki o tym samym ID umieszczać do folderu o tym ID ? - Nie trzeba by używać funkcji glob() do wyszukiwania plików bo linki mógłbym wygenerować. Ale czy ilość katalogów na serwerze może go spowolnić ?


Proszę o odpowiedzi jaka byłaby różnica między wydajnością obu tych rozwiązań i co by było lepsze.
darko
Pytasz o wydajność, a nie napisałeś najważniejszego, w jaki sposób korzystasz z tych plików w kodzie? To znaczy czy wczytujesz je partiami po np. 10-100 obrazków czy wybierasz kilka (5-20) i tylko tyle jest Ci potrzebne czy może potrzebne są Ci w jednej chwili wszystkie nazwy tych plików, np. sortujesz je alfabetycznie? Wszystko zależy od tego, w jaki sposób i jakie zadanie ma realizować Twój kod.
Sztef89
Cytat(darko @ 25.11.2011, 18:33:21 ) *
Pytasz o wydajność, a nie napisałeś najważniejszego, w jaki sposób korzystasz z tych plików w kodzie? To znaczy czy wczytujesz je partiami po np. 10-100 obrazków czy wybierasz kilka (5-20) i tylko tyle jest Ci potrzebne czy może potrzebne są Ci w jednej chwili wszystkie nazwy tych plików, np. sortujesz je alfabetycznie? Wszystko zależy od tego, w jaki sposób i jakie zadanie ma realizować Twój kod.


Masz rację, napisałem zbyt ogólnikowo.
Pliki będę wyświetlał częściowo min 6 sztuk - w zależności ile ID będę miał do wyszukiwania, każde ID to 6 plików. Średnio jakieś 20-30 obrazków będzie wyświetlanych. Ale nigdy nie będzie takiej sytuacji żebym musiał wszystkie pliki wyświetlić itd.

Każdy plik składa się z: ID.numeru.rozszerzenia, np.: ssssakkk333.234.jpg

darko
Przy takiej ilości obrazków i takiej operacji to raczej nie ma znaczenia czy masz wszystko w jednym worku czy skatalogowane. co innego, gdybyś musiał np. przeszukać wszystkie pliki po nazwie, to jeden worek wydaje się być tutaj lepszym rozwiązaniem.
Sztef89
Cytat(darko @ 25.11.2011, 18:44:40 ) *
Przy takiej ilości obrazków i takiej operacji to raczej nie ma znaczenia czy masz wszystko w jednym worku czy skatalogowane. co innego, gdybyś musiał np. przeszukać wszystkie pliki po nazwie, to jeden worek wydaje się być tutaj lepszym rozwiązaniem.


czyli wyszukiwanie kilku plików które mają w nazwie dane ID, spośród ok 100 000 000 plików trwa prawie tyle co posiadając do nich gotowe adresy ? Rozumiem, że tu różnica to w kilkunastu milisekundach jest ? wink.gif
markonix
Tutaj troszkę o limitach..
Jeśli miałbyś je przekroczyć foldery będą dobrym rozwiązaniem.
darko
Tak naprawdę nie musisz przeszukiwać wszystkich plików żeby stwierdzić czy podane dane wejściowe po odpowiednim sformatowaniu utworzą poprawną ścieżkę do pliku, skoro znasz reguły tworzenia nazwy pliku. Ja zrobiłbym to tak, że sprawdziłbym tylko czy plik istnieje w spodziewanej lokalizacji:
  1. $file = '/home/folder/ssssakkk333.234.jpg';
  2. if(is_file($file))
  3. {
  4. // tu operacje na znalezionym pliku
  5. }
  6. else
  7. {
  8. // niestety nie znaleziono pliku
  9. }

Podejrzewam, że glob, skacząc po różnych folderach zeżarłby znacznie więcej czasu/zasobów niż gdybyś szukał w tylko jednym folderze na dużej puli nazw, oczywiście to można sprawdzić pisząc jakiś krótki teścik na reprezentatywnej ilości plików.
// edit
Cytat(markonix @ 25.11.2011, 17:54:21 ) *
Tutaj troszkę o limitach..
Jeśli miałbyś je przekroczyć foldery będą dobrym rozwiązaniem.

Właściwie praktycznie jedynym sensownym.
Niktoś
Wyszukiwanie pliku w 100 000 000 plikach jest szybsze niż wyszykiwanie jednego pliku w podkatalogu z 6 plikami?
Dla mnie wydaje się to trochę niedorzeczne wręcz fenomenalne.
Sztef89
Cytat(Niktoś @ 25.11.2011, 19:02:56 ) *
Wyszukiwanie pliku w 100 000 000 plikach jest szybsze niż wyszykiwanie jednego pliku w podkatalogu z 6 plikami?
Dla mnie wydaje się to trochę niedorzeczne wręcz fenomenalne.


nie gdy znasz ścieżkę do tego katalogu, a nie znasz dokładnych nazw plików w nim się znajdującym wink.gif

Ograniczenia z linku powyżej myślę że nie są do osiągnięcia... FAT 32 ma ograniczenie 65535 plików w jednym folderze, tylko ciekawe jakiego systemu plików teraz serwery używają, ja nie miałem tego okazji sprawdzić ale wydaje mi się, że z tych excośtam, czyli linuxowych więc limit plików by mnie nie obowiązywał wink.gif

Cytat
Tak naprawdę nie musisz przeszukiwać wszystkich plików żeby stwierdzić czy podane dane wejściowe po odpowiednim sformatowaniu utworzą poprawną ścieżkę do pliku, skoro znasz reguły tworzenia nazwy pliku. Ja zrobiłbym to tak, że sprawdziłbym tylko czy plik istnieje w spodziewanej lokalizacji:


FAKTYCZNIE !
katalog z plikami znam
początki plików znam
numerki ich znam 1-6

wiec faktycznie nic nie trzeba przeszukiwać biggrin.gif

Załóżmy ze serwer pracuje na NTFS lub innym systemi plików gdzie limity są dla mnie nie do osiągnięcia. Co wtedy byście doradzili. Grupować pliki w katalogach czy wszystko pakować do jednego folderu ? smile.gif
erix
Grupować.

Teoretycznie niektóre FS-y nie mają limitów, ale z praktycznego punktu widzenia, ręczne listowanie (a czasem się przydaje, choćby do backupu), to mordęga.
thek
Grupować. Ktoś kto pisze o waleniu do jednego wora chyba zapomniał, że czasem jest konieczność zajrzenia na serwer przy pomocy ftp choćby. Gratuluję temu, kto będzie zaglądał do katalogu z milionem plików wewnątrz. Niech się spodziewa oczekiwania na samo wylistowanie tego kupę czasu. Już nawet nie mówię, że klienty ftp też mają limity i zobaczysz tylko X pierwszych plików.
abort
Krótki test: 60 tysięcy plików w katalogu. Najprostszy dostęp do listy wszystkich plików to wylistowanie wszystkich plików z poziomu systemu operacyjnego. Czas: 1.8 sekundy (Linux, Sempron 2500, dysk SATA, system plików ext3). Dołóż narzut na ftp (jak pisał thek) i nie wiem, ile czasu poczekasz na łączu. wylistowanie jednego pliku z konkretną nazwą oczywiście odbywa się momentalnie. Ale już przy 60k plików spowolnienie jest zauważalne. Przy liniowości spowolnienia na listing plików poczekałbyś pół minuty.

Wniosek: grupować.
Argument "ZA" - projektanci squida (proxy www) też używają grupowania - dwa poziomy katalogów i dopiero dalej plik (jest to sprawa do ustalenia w pliku konfiguracyjnym). I jest to dostępne odkąd pamiętam (czyli można uznać, że "od zawsze")
thek
No i nie zapomnij abort, że chyba każdy klient ma limit widocznych plików w katalogu. Niby FileZilla odczyta wszystkie jakie ale sam serwer FTP narzuca limity, które są zazwyczaj na kilka lub kilkanaście tysięcy. Pytanie więc teraz.. Czy masz dostęp do serwera na tyle, by mu zmienić ustawienia by "dla pewności" wytrzymał wylistowanie kilkunastu milionów plików? Poza tym... Ile to potrwa? Ja już przy kilkudziesięciu tysiącach mam kosmiczne oczekiwanie na odpowiedź serwera. A niestety zastałem taki skrypt, gdzie w katalogu pewnym mam kilkanaście tysięcy katalogów i zwyczajnie serwer FTP nie daje rady. Gdybym nie wiedział z góry skąd biorą nazwy to bym się po prostu pochlastał smile.gif A tak z palca mogę je wpisać i wiem, że mi przejdzie gdzie trzeba. Tylko że nie zawsze to wiesz i to jest problem.
Niktoś
@abort mówisz teraz o wylistowaniu,weź teraz wyszukiwanie 1 pliku z tej gromadki plików-ile to użytkownik sobie teraz poczeka,aż mu wynik zwróci??
W takich sytuacjach tylko katalogi.
abort
@thek, niktoś:
ależ ja doskonale o tym wiem. Bijemy pianę, a autor pierwszego posta i tak zrobi jak zechce. Najwyżej potknie się o własne błędy i będzie zmuszony do przeprojektowania aplikacji.
@thek: problemy z ftp nie są jedynymi - problemy dotyczą każdego sieciowego dostępu do plików (czy to ftp, czy samba, czy nawet wystawienie takiego katalogu via www). Po prostu każdy dostęp uwypukla jedne problemy bardziej, inne mniej.
Pilsener
Raz: nawet jeśli nie ma to wpływu na wydajność to dobrze jest pogrupować pliki
Dwa: dobrze je nazywać od ID albo tworzyć losową nazwę, wtedy plik o nazwie np. 123456.exe będzie w folderze 1/2/3 - ma to sens bo wiemy w jakim folderze szukać pliku o danej nazwie
thek
@Pilsener: gdyby zmiana była stricte kosmetyczna, to ludzie olewali by to czy katalogować czy nie i robili co dla nich wygodniejsze,

@abort: Pozostałe zdania (od "Pytanie więc teraz...") pisałem już do autora, a nie Ciebie, ale źle to uwypukliłem smile.gif Widzę od pierwszego posta, że wiesz o co chodzi w problemie i nie mam nic do zarzucenia Ci od strony merytorycznej.
Sztef89
Troszkę nie spodziewałem się, że rozmowa się tak rozwinie ale lepiej dla mnie i innych z podobnym problemem smile.gif

W mojej sytuacji wygląda to tak, czy będę katalogował czy też nie to zawsze będę znał nazwy plików. Jeszcze w jednym skrypcie używam przeszukiwania (znam 90% nazwy pliku) ale to się zmieni.
Przez ftp raczej nie będę wchodził do tych katalogów, wiadomo. Obrazki mniej więcej pogrupowałem ale nadal ich mam sporo, największy katalog ma ok 100 000 plików (po jednym obrazku dla każdego ID dlatego bardziej pokatalogować się nie da).

Jeżeli chodzi o backupy to najlepiej po stronie serwera spakować zipem wszystko co chcemy i potem ten plik ściągnąć. A napisanie skryptu php do tego to pestka tongue.gif Tylko ciekawe jak szybko trwa taka kompresja przy 1mln plików do 1MB każdy biggrin.gif

Chciałbym podziękować wszystkim za rozmowę. Będę dążył do katalogowania wszystkiego na tyle ile się da. Myślę, że wszystkie niedoskonałości wyjdą w testach, jak będę miał problemy to będziemy dalej dyskutować wink.gif
by_ikar
Szybkość kompresji plików zależy od tego jak one są wielkie. Ilość tych plików ma drugorzędne znaczenie IMO. Najgorzej się kompresuje obrazy, pliki audi/wideo. Jeżeli obrazy są niewielkie (powiedzmy po parę kilo) to idzie to dość sprawnie. Nie mam co prawda tyle plików co ty, bo mam koło 80k plików graficznych w jednym katalogu, to pakuje się w sumie dość szybko wink.gif osobiście to nie zrobiłem tego w php z oczywistego problemu z timeout, tylko napisałem to w bashu, podpiąłem pod cron i późnymi nocnymi godzinami się archiwizuje, po czym wysyła na zdalny serwer ftp.
Sztef89
faktycznie nie pomyślałem o timeout na serwerze, pracuje dużo na localhoscie, mam timeout na 24h ustawiony i się przyzwyczaiłem biggrin.gif
Pewnie sposób backupu rozwiąże podobnie jak ty wink.gif Dzięki za info
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.