konto usunięte

Temat: Organizacja pików użytkowników

Witam,
mam małe pytanie odnośnie organizacji katalogów w aplikacji. Bardzo duża liczba plików w jednym katalogu to nigdy nie był dobry pomysł (już chociażby w sytuacji gdy otwieramy taki katalog w menedżerze plików.
Każdy użytkownik aplikacji będzie miał swój katalog. W każdym katalogu będzie maksymalnie 12 plików. Zostaje kwestia taka że przewidujemy dość dużą liczbę użytkowników.
Tutaj przyszła mi do głowy organizacja katalogów na podstawie daty rejestracji użytkownika. Mniej i więcej w ten sposób:

/ROK/MIESIAC/DZIEN/ID

Co na bardzo długi czas sprawę załatwi. Jednak chciał bym zapytać o jakieś ciekawsze rozwiązania w tym względzie. Zastanawiam się również nad rozwiązaniem jakie zastosowaliśmy w jednym projekcie, gdzie katalog był po prostu wynikiem dzielenia całkowitego ID/X.

I tak np id: 1 234 854 lądowało w katalogu 123. Wewnątrz takiego katalogu również można było przeprowadzić taką operację. Ale wtedy mieliśmy do czynienia z bardzo dużą ilością katalogów.

Z góry dziękuję za sugestie. Pozdrawiam.Dariusz Półtorak edytował(a) ten post dnia 26.04.11 o godzinie 10:34

konto usunięte

Temat: Organizacja pików użytkowników

Dariusz Półtorak:
Wit

Falstart czy zmęczenie po świętach? ;)

konto usunięte

Temat: Organizacja pików użytkowników

Falstart. Palnąłem w ENTER pisząc tytuł (pewnie przez zmęczenie po świętach) :-)Dariusz Półtorak edytował(a) ten post dnia 26.04.11 o godzinie 10:33
Mateusz K.

Mateusz K. Business Solution
Analyst, Damco
Poland Sp z o.o.

Temat: Organizacja pików użytkowników

Dariusz Półtorak:
Każdy użytkownik aplikacji będzie miał swój katalog. W każdym katalogu będzie maksymalnie 12 plików. Zostaje kwestia taka że przewidujemy dość dużą liczbę użytkowników.

Podobny temat został poruszony w PHPArch:

http://www.phparch.com/magazine/2010-2/may/ i artykuł "Don’t Use True File Names!".

Sytuacja może nie jest dokładnie ta sama, jednak polecam zarówno sam artykuł jak i magazyn :)
Mateusz K.

Mateusz K. Business Solution
Analyst, Damco
Poland Sp z o.o.

Temat: Organizacja pików użytkowników

Dariusz Półtorak:
Każdy użytkownik aplikacji będzie miał swój katalog. W każdym katalogu będzie maksymalnie 12 plików. Zostaje kwestia taka że przewidujemy dość dużą liczbę użytkowników.

Podobny temat został poruszony w PHPArch:

http://www.phparch.com/magazine/2010-2/may/ i artykuł "Don’t Use True File Names!".

Sytuacja może nie jest dokładnie ta sama, jednak polecam zarówno sam artykuł jak i magazyn :)
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Organizacja pików użytkowników

rozmawialem niedawno o podobnym problemie z doswiadczonym adminem, ogolnie kwestia skalowalnosci i budowanie klastra do trzymania milionow plikow.

wniosek byl taki ze struktura slownikowa jest jedynym sensownym rozwiazaniem:

haszujesz nazwe pliku np: md5
plik przykladowo nazywa sie: abcdefgh12345678abcdefgh12345678
wiec umieszczasz go np w:
/a/ab/abc/abcdefgh12345678abcdefgh12345678

taka strukture latwo rozproszyc po wielu serwerach przykladowo za pomoca nfs, oczywiscie powyzsze to tylko przyklad bo mozna to zmodyfikowac tak aby wyeliminowac ryzyko kolizji hasha

kolejna kwestia to system plikow jakiego uzywasz, standardowo katalog nie jest indeksowany i odszukanie pliku zajmuje jakis czas, jezeli system plikow wspiera indeksowanie katalogow to czas wyszukiwania jest mniejszy, typowa zlozonosc O(lgn)

zdania sa podzielone ale lepiej nie trzymac wiecej niz kilka tysiecy plikow w katalogu, ja bym zszedl do ~2k
Stanisław P.

Stanisław P. Software designer

Temat: Organizacja pików użytkowników

Zdecydowanie popieram Łukasza. Pamiętaj tylko, że jak hashujesz nazwy, to łatwo spowodować kolizje - trzeba to obsługiwać. Przy plikach poniżej 1MB, można śmiało hashować po prostu zawartość.
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Organizacja pików użytkowników

hashowanie zawartosci pliku w celu utworzenia nazwy pliku to imho sredni pomysl, przykladowo w javie, php czy c zgodnie z dobrymi praktykami mozesz wyizolowac operacje na plikach jako osobna warstwa, chociazby przeciazyc klase File czy stworzyc wrappery na funkcje fopen itd.
Jezeli do zlokalizowania nazwy pliku potrzebujesz znac jego zawartosc to wtedy taki storage dziala tylko w jedna strone (zapis).
W przypadku gdy hash tworzysz z nazwy pliku to po pierwsze storage dziala w dwie strony - zapis i odczyt, po drugie jest szybszy bo generowanie hasha zajmuje czas proporconalny do wejscia, i po trzecie mozesz ukryc cala abstrakcje zwiazana z trzymaniem i lokalizowaniem pliku i miec api ktore wyglada zupelnie jak api do obslugi plikowŁukasz C. edytował(a) ten post dnia 26.04.11 o godzinie 22:53
Tomasz Zadora

Tomasz Zadora programuję

Temat: Organizacja pików użytkowników

Oprócz samej organizacji plików jest też sprawa związana z czasem dostępu do pliku, jeżeli w jednym katalogu jest zbytu dużo plików to czas dostępu zaczyna się wydłużać.

Wiadomo, że nie jest to problem we wszystkich systemach plików ale w niektórych tak.

Ja zrobiłem specjalny algorytm który na podstawie liczby całkowitej zwraca (i może stworzyć) katalog gdzie powinien się znaleźć plik.

Przy czym dla funkcji do której przekazujemy liczbę można określić ile maksymalnie może być w danym katalogu podkatalogów i plików.

Skąd wziąć liczbę ? Najczęściej plik jest powiązany z jakimś identyfikatorem liczbowym, a jeżeli nie to po prostu można zrobić np. crc32 na nazwie pliku.


/**
* Pobiera katalog w którym powinien być umieszczony
* plik o id 'fileId'.
*
* W każdym katalogu może być określona, maksymalna liczba plików,
* oraz określona, maksymalna liczba podkatalogów.
*
* Na podstawie 'fileId' są określane katalogi (o dowolnym zagłębieniu).
*
* Jeżeli maxFiles = 100 oraz maxDirs = 10, to plik o id 10001 będzie
* w katalogu (zostanie zwrócone): 0/9/
*
* @param int $fileId - indentyfikator liczbowy
* @param int $maxFiles - max liczba plikow w katalogu
* @param int $maxDirs - max liczba podkatalogow
* @param boolean $createDirs - czy sprawdzac/tworzyc katalogi ?
* @param string $path - sciezka poczatkowa, uzywana razem z $createDirs
*
* $path nie jest zwracane z funkcji.
*
* Funkcja zwraca katalog dla zasobu, moze byc pusty "" dla niskich liczb.
*/
static function getClusterFile($fileId, $maxFiles = 100, $maxDirs = 10,
$createDirs = false, $path = "")
{
$rt = "";

if ($createDirs)
{
if (!file_exists($path))
{
if (!mkdir($path, 0777)) return false;
@chmod($path, 0777);
}
}

if ( $fileId <= 0 || $fileId <= $maxFiles ) return "";

// Reszta z dzielenia fileId / maxFiles
$restId = $fileId%$maxFiles;

$formatedFileId = $fileId - $restId;

// Liczba katalogów jaka jest potrzebna do umieszczenia
// pliku
$howMuchDirs = $formatedFileId / $maxFiles;

while ($howMuchDirs > $maxDirs)
{
$r = $howMuchDirs%$maxDirs;
$howMuchDirs -= $r;
$howMuchDirs = $howMuchDirs/$maxDirs;
$rt .= $r . '/'; // DIRECTORY_SEPARATOR = / (zazwyczaj)

if ($createDirs)
{
$prt = $path.$rt;
if (!file_exists($prt))
{
mkdir($prt);
@chmod($prt, 0777);
}
}
}

$rt .= $howMuchDirs-1;
if ($createDirs)
{
$prt = $path.$rt;
if (!file_exists($prt))
{
mkdir($prt);
@chmod($prt, 0777);
}
}

$rt .= '/'; // DIRECTORY_SEPARATOR = / (zazwyczaj)

return $rt;
}


Enjoy - mile widziane jakieś ulepszenia algorytmu.
Stanisław P.

Stanisław P. Software designer

Temat: Organizacja pików użytkowników

Łukasz C.:
W przypadku gdy hash tworzysz z nazwy pliku to po pierwsze storage dziala w dwie strony - zapis i odczyt, po drugie jest szybszy bo

A co w sytuacji jak 2 osoby wyślą dwa różne "test.jpg"?
I tak w większości wypadków musisz skądś wygenerować tą nazwę - czy to hash, czy coś innego. Zwykle będzie to baza danych. Więc tak naprawdę nie ma znaczenia czego to będzie hash.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Organizacja pików użytkowników

Zamiast bawić się z hashem wystarczy uniqid.

http://pl2.php.net/uniqidTomasz Zadora edytował(a) ten post dnia 26.04.11 o godzinie 23:43
Jakub L.

Jakub L. Programista

Temat: Organizacja pików użytkowników

Chyba dryfujecie.
Każdy użytkownik aplikacji będzie miał swój katalog. W każdym katalogu będzie maksymalnie 12 plików. Zostaje kwestia taka że przewidujemy dość dużą liczbę użytkowników.
Jak dla mnie najprostsza implementacja to walnięcie każdemu użytkownikowi osobnego katalogu, skoro katalogi i tak muszą być, i w tym katalogu plików nazwanych jakkolwiek, najpierw przyjrzałbym się planowanej strukturze i działaniu aplikacji i czy możliwe są w przypadku pojedynczego użytkownika (ze względu na osobne ich katalogi) konflikty na prostych timestampach (albo czy będą w przyszłości).
A katalogi użytkowników to tak żeby było wygodnie systemowi plików - haszowanie po określonej licznie katalogów, czy też po kolei katalog trzymający katalogi userów od 1 do 2k, następny od 2k1 do 4k i tak dalej, ewentualnie kolejny poziom - od 1 do 4m, bawić się w sufiksowość gdzie odpowiednio podzielony identyfikator użytkownika da jednoznacznie ścieżkę i tym podobne mikrooptymalizacje.
Jakub L.

Jakub L. Programista

Temat: Organizacja pików użytkowników

Tomasz Zadora:

if ( $fileId <= 0 || $fileId <= $maxFiles ) return [/quote]>

Analiza oczna kazała się zapytać czy jesteś pewny?
Tomasz Zadora

Tomasz Zadora programuję

Temat: Organizacja pików użytkowników

Przetestuj funkcje później krytykuj.

Jeżeli każdy plik ma unikalny identyfikator liczbowy (nieujemny) założenia funkcji zawsze będą spełnione - czyli max plików i podkatalogów w katalogu.Tomasz Zadora edytował(a) ten post dnia 26.04.11 o godzinie 23:56

konto usunięte

Temat: Organizacja pików użytkowników

Tak czytając powyższe myślę że:
- wygeneruję hash z adresu email
- rozbiję go na X-znakowe ciągi i wg tego stworzę ścieżkę
- dokleję na koniec id użytkownika

W ten sposób
- całość będzie działać dwustronnie czyli nie muszę zapisywać nigdzie w bazie lub gdzieś indziej ścieżki bo idzie ją odzyskać
- nie mam się co martwić o kolizję nazw z uwagi na to że nawet jeżeli ona nastąpi to ratuje mnie na koniec katalog z id użytkownika w nazwie
- całość powinna sobie poradzić z dużą ilością użytkowników

Kwestia taka że taka struktura i tak prędzej czy później solidnie się rozrośnie. Ale to bardzo odległy problem, jeżeli w ogóle będzie problemem. Skłaniał bym się w tym kierunku.

konto usunięte

Temat: Organizacja pików użytkowników

Dariusz Półtorak:
- wygeneruję hash z adresu email
A co jak zmieni się email?
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Organizacja pików użytkowników

bazuj na id badz jakims unikalnym tokenie
Jakub L.

Jakub L. Programista

Temat: Organizacja pików użytkowników

Tomasz Zadora:
Przetestuj funkcje później krytykuj.

Jeżeli każdy plik ma unikalny identyfikator liczbowy (nieujemny) założenia funkcji zawsze będą spełnione - czyli max plików i podkatalogów w katalogu.

Z kwantyfikatorami bym nie przesadzał, zawsze. Zawsze, za wyjątkiem przypadków gdzie nie będzie max plików i katalogów, bo ich po prostu tyle nie będzie.

Widzę że jesteś z tych, którzy odbierają jakiekolwiek pytania do kodu jako próba tańca po jajkach, życzę powodzenia w pracy w zespołach, jeżeli w ogóle.

Pliki z ujemnymi fileid zawsze wylądują w toplevelu.
CreateDirs ustawione na 1 wraz z path pozwala dowolnie zaśmiecić toplevel.

Jak weźmiemy plik dajmy na to 1, to wyląduje w toplevelu.
Jak weźmiemy plik dajmy na to 200, to według tej funkcji przy maxfiles == 100 dostanie ścieżkę 1/, ale w toplevelu już jest plik zwany 1.
Wygląda jak kolizja.

A krytyka to byłaby że czasem stawiasz spacje przed i po operatorach, a czasem nie, to samo przy strukturach sterujących.
Tomasz Zadora

Tomasz Zadora programuję

Temat: Organizacja pików użytkowników

Jakub L.:
[...]
Z kwantyfikatorami bym nie przesadzał, zawsze. Zawsze, za wyjątkiem przypadków gdzie nie będzie max plików i katalogów, bo ich po prostu tyle nie będzie.

Czasem nie będzie czasem będzie, takie założenia można robić do konkretnego projektu a nie na poziomie abstrakcyjnym. Na poziomie abstrakcyjnym nie wiadomo. Możesz mieć projekt gdzie będzie kilkaset plików i w ogóle można sobie takie metody odpuścić a możesz mieć projekt z kilkoma milionami plików które generalnie będą miały sekwencyjnie ustawiane id i nie będą usuwane.
Widzę że jesteś z tych, którzy odbierają jakiekolwiek pytania do kodu jako próba tańca po jajkach, życzę powodzenia w pracy w zespołach, jeżeli w ogóle.

Twoje pytanie wyglądało na głupią zaczepkę.

Pliki z ujemnymi fileid zawsze wylądują w toplevelu.
CreateDirs ustawione na 1 wraz z path pozwala dowolnie zaśmiecić toplevel.

Akurat stosowanie ujemnych identyfikatorów to raczej dość rzadka i dziwna sprawa. Zawsze można wtedy dokonać modyfikacji.
Jak weźmiemy plik dajmy na to 1, to wyląduje w toplevelu.
Jak weźmiemy plik dajmy na to 200, to według tej funkcji przy maxfiles == 100 dostanie ścieżkę 1/, ale w toplevelu już jest plik zwany 1.
Wygląda jak kolizja.

Dlatego plikom się nadaje unikalne nazwy np. przez uniqid.

Już nie mówiąc o tym, że pliki zazwyczaj mają jakieś rozszerzenie - to co piszesz to po prostu głupie zaczepki (prowokacje), nie żadna krytyka - i Ty piszesz o pracy zespołowej ? Śmiech.

EOT jeżeli chodzi o dyskusje z Tobą.

konto usunięte

Temat: Organizacja pików użytkowników

Michał Wachowski:
Dariusz Półtorak:
- wygeneruję hash z adresu email
A co jak zmieni się email?

Odpowiedź:
Łukasz C.:
bazuj na id badz jakims unikalnym tokenie

:-) Fakt, dobra uwaga. Lepiej wybrać coś co się dla danego użytkownika nie zmieni, jak właśnie id. Dzięki wam za uwagi.



Wyślij zaproszenie do