Random afbeeldingen opvragen uit een map of een database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • D.I.N.G
  • Registratie: Januari 2010
  • Laatst online: 18-09 11:19
Ik ben bezig aan een hobby website waar in het midden een afbeelding staat, die elke keer wordt vernieuwd wanneer er op geklikt wordt, de map waar de afbeeldingen instaan scant en in een array zet en daaruit een random afbeelding kiest. Voor elke nieuwe afbeelding wordt het script weer gestart.

Dit heb ik gedaan met een PHP script en het werkt nu gewoon nog goed en snel, maar mijn vraag aan jullie is zal dit ook zo blijven als het aantal afbeeldingen groeit naar 100>1000 enzovoort? En is het beter en efficiënter om de afbeeldingen in een database te plaatsen en ze daaruit op te vragen?

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
is het niet makkelijker om afbeeldingen opeenvolgend te nummeren en dan random een volgnummer te pakken? dan hoef je alleen te kijken hoeveel bestanden er zijn, vervolgens een random tussen 0 en aantal bestanden, en dan evt. nog controleren of het bestand bestaat. :)

Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Het is zeer afhankelijk van de exacte implementatie,

Bij dit array lees je de complete afbeelding in of alleen de paden? Als je het pad alleen in een array leest zal het sneller zijn en minder overhead dan elke afbeelding in het array laden.

Je kan ook van te voren het nummer bepalen en vervolgens in de dir een x aantal files doorlopen tot je bij het random nummer bent, en vervolgens de file laden, dan skip je het filename -> arrayplaatsen stapje.

Je kan dit trouwens ook zelf makkelijk testen, gewoon 1 (of meerdere) afbeelding 10.000 x kopieren en testen wat de snelheid is.

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Zolang je het in veel subdirectories doet met max 100 bestanden/directories per directory gaat het prima, dan moet je gewoon een paar keer een random item uit een lijst pakken.

Maar een sequentiele volgorde van afbeeldingen met een random op een getal met het aantal afbeeldingen als max is natuurlijk sneller. Dat vereist dus alleen wel dat je geen missende nummers hebt. Een andere optie is alles in een database stoppen, al lijkt me dat overkill als je er verder niets mee wil doen.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

marabunta2048 schreef op woensdag 07 april 2010 @ 16:54:
is het niet makkelijker om afbeeldingen opeenvolgend te nummeren en dan random een volgnummer te pakken? dan hoef je alleen te kijken hoeveel bestanden er zijn
Waarbij je er voor het gemak maar even vanuit gaat dat het aantal files in een directory opvragen goedkoper is dan alle files op te vragen, wat geenszins het geval hoeft te zijn aangezien die dingen typisch in dezelfde file staan opgeslagen :). Ook moet je je bedenken dat het serveren van het plaatje zelf waarschijnlijk een stuk duurder is dan het keer op keer uitlezen van de directory die daardoor toch wel in de filecache van het OS blijft staan.

[ Voor 16% gewijzigd door .oisyn op 07-04-2010 17:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • D.I.N.G
  • Registratie: Januari 2010
  • Laatst online: 18-09 11:19
Bedankt allemaal voor jullie snelle reacties.

Dus jullie raden allemaal aan om alle afbeeldingen opeenvolgende te nummeren, dan moet alle afbeeldingen geteld worden en dan een rondom nummer/afbeelding laten ophalen. Hier zal ik is mee aan de slag gaan.

Nog enkele vraagjes:
Moeten de extensies van alle afbeeldingen hetzelfde zijn?
Als ik gebruik ga maken van submappen, moet ik dan elke submap laten tellen of kan ik gewoon de hoofdmap laten tellen waarin die submappen staan?

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 19-09 14:42
Het opeenvolgend nummeren zou ik juist afraden. Dat wordt ontzettend slecht onderhoudbaar: als je afbeeldingen wilt verwijderen of toevoegen moet je telkens zorgen dat de nummering correct blijft. Dat gaat vanzelf een keer mis...
Verder doet het niet zoveel aan de performance om de reden die .oysin al aangeeft: de informatie over het aantal bestanden in een directory komt uit hetzelfde bestand als de bestandsnamen zelf. Ik zou dus lekker de implementatie laten zoals hij is. Mocht je tegen performanceproblemen aanlopen dan kun je altijd nog iets slims bedenken. Mocht de bottleneck inderdaad blijken te zitten in het opvragen van de afbeeldingen dan kun je bijvoorbeeld het resultaat van die actie ergens cachen...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
D.I.N.G schreef op woensdag 07 april 2010 @ 18:27:
Bedankt allemaal voor jullie snelle reacties.

Dus jullie raden allemaal aan om alle afbeeldingen opeenvolgende te nummeren, dan moet alle afbeeldingen geteld worden en dan een rondom nummer/afbeelding laten ophalen. Hier zal ik is mee aan de slag gaan.

Nog enkele vraagjes:
Moeten de extensies van alle afbeeldingen hetzelfde zijn?
Als ik gebruik ga maken van submappen, moet ik dan elke submap laten tellen of kan ik gewoon de hoofdmap laten tellen waarin die submappen staan?
Ik zou je sterk afraden om je afbeeldingen opeenvolgend te gaan nummeren, dat is een ramp als er even 1 afbeelding uitmoet. Het werkt leuk in 1e opzet, maar het onderhoud is gewoon een ramp...

Zelf zou ik gewoon iets van een periodieke crawler schrijven die ergens ( in een dbase als je die gebruikt, anders gewoon een flat file met 1 bestand per regel ) de bestandsnamen/paden opslaat en waaruit je gewoon regel x kunt pakken. x is dan de output van random.
De crawler kan je dan zo inrichten als je wilt.

Enkel bedenk je heel goed dat dit zo ongeveer wel een micro-optimalisatie is zolang je geen extra metadata aan je bestandsnamen gaat hangen. Zolang het enkel om bestands/pad namen gaat is het enkel de FAT doorzoeken ( en dat is veelal sneller dan andere manieren )
1.000 of 10.000x de FAT doorzoeken was in de 8086 tijd al triviaal, moet je eens bedenken hoe triviaal het nu is.

Acties:
  • 0 Henk 'm!

  • D.I.N.G
  • Registratie: Januari 2010
  • Laatst online: 18-09 11:19
Ik heb het nu zo gedaan.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$dir = opendir('images');

while(false !== ($file = readdir($dir))) 
{
    if(($file !== ".") && ($file !== "..")) 
    {
        list($filename, $ext) = explode(".", $file);
        $ext = strtolower($ext);
        if(($ext == "jpg") || ($ext == "png") || ($ext == "gif" ||$ext == "jpeg"))
        {
            $afbeelding[] = $file;
        }
    }
}
closedir($dir);

$aantal = count($afbeelding) - 1;
$rand = mt_rand(0, $aantal);
echo "<img src=\"images/".$afbeelding[$rand]."\">";
?>

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Dat is leuk, maar dat gaat nooit schalen tot veel (10.000+) afbeeldingen.

Als je dat wil doen dan moet je gewoon meerdere directories pakken zodat je iets als dit krijgt: 01/23/45/23.jpg

Afhankelijk van hoeveel afbeeldingen je verwacht moet je het aantal subdirectories veranderen. Als je uitgaat van 00-99 heb je dus 100 items per directory, met 00/00-99/99 zou je dus al 10.000 items hebben. Elke extra directory levert 100 maal zoveel mogelijkheden op.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom zou het uitlezen van 1 enkele grote directory minder goed schalen dan het uitlezen van N/100 kleinere directories?

.edit: sterker nog, ik zou stellen dat het juist beter schaalt - er hoeft immers niet recursief directories afgezocht te worden. Wat wel minder goed schaalt zijn changes aan het filesystem door het operating system als je een file toevoegt of verwijdert. Maar dat komt in de regel veel minder vaak voor dan reads.

[ Voor 68% gewijzigd door .oisyn op 08-04-2010 01:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • D.I.N.G
  • Registratie: Januari 2010
  • Laatst online: 18-09 11:19
Maar is het gebruik van meerdere directoires makkelijke te combineren met de code die ik nu heb of moet ik het dan totaal anders aanpakken? Als iemand misschien een voorbeeld heeft dan zou ik daar heel blij mee zijn aangezien mijn kennis van php niet al te goed is.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kijk, je kan het natuurlijk ook gewoon even proberen. Maak een scriptje dat 10.000 plaatjes in die directory pleurt en zie wat het doet met je performance. Ik denk dat het wel meevalt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • D.I.N.G
  • Registratie: Januari 2010
  • Laatst online: 18-09 11:19
Ik heb even een test gedaan met 3100 afbeeldingen waarbij ik 10 min lang ongeveer elke seconden om een nieuwe afbeelding vroeg en dat ging gewoon goed want de afbeeldingen werden snel geladen.

Dus ik denk dat ik het gewoon zo laat en als ik een keer problemen tegenkom dat ik dan wel naar een andere oplossing ga kijken.
Pagina: 1