Toon posts:

MySql en veel BLOB data

Pagina: 1
Acties:
  • 246 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik moet een database structuur bouwen met BLOB velden voor het opslaan van plaatjes. De reden waarom de plaatjes in een db moeten doet even niet ter zaken ;-) Ik verwacht een toenamen van 15 GB ( yip ... 1500 MB ) aan data per jaar. Heeft iemand ervaring met dit soort data hoeveelheden in een database. Het opzoeken van de data gaat aan de hand van een id, geen ingewikkelde zoek queries. Wat is belangrijk en hoe reageert mysql op dit soort hoeveelheden. De data wordt opgeslagen in een storage array met een fiber link dus de snelheid zit wel goed...

Ieder commentaar is welkom..... :9

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09-2025
Denk dat MySQL het wel trekt :) Als je toch alleen op id zoekt :)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 03-04 19:24

gorgi_19

Kruimeltjes zijn weer op :9

Volgens mij gaat MySQL zulke enorme hoeveelheden aan dataopslag niet echt plezierig vinden. Daarnaast is in dit geval een stresstest met een dummydatabase denk ik wel een optie

Verder blijf ik het wel interessant vinden waarom je alles in een db wilt opslaan. De gebruikelijke methode is volgens mij om alleen de link op te slaan in de db en het plaatje te uploaden naar een lokatie. Het weergeven kan dan doormiddel van een script gedaan worden (dus:

[img]"picture.php">[/img]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Juup
  • Registratie: Februari 2000
  • Niet online
Op zaterdag 06 juli 2002 22:44 schreef dr2epacs het volgende:
Ik verwacht een toenamen van 15 GB ( yip ... 1500 MB ) aan data per jaar.
15 GB = 15000 MB

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Verwijderd

Op zaterdag 06 juli 2002 22:48 schreef gorgi_19 het volgende:
Volgens mij gaat MySQL zulke enorme hoeveelheden aan dataopslag niet echt plezierig vinden. Daarnaast is in dit geval een stresstest met een dummydatabase denk ik wel een optie

Verder blijf ik het wel interessant vinden waarom je alles in een db wilt opslaan. De gebruikelijke methode is volgens mij om alleen de link op te slaan in de db en het plaatje te uploaden naar een lokatie. Het weergeven kan dan doormiddel van een script gedaan worden (dus:

[img]"picture.php">[/img]
Dit zou ik ook doen: je brengt de load van de MySQL server enorm omlaag, en static plaatjes gaat toch heel wat sneller dan een blob in een db ;)

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zaterdag 06 juli 2002 22:44 schreef dr2epacs het volgende:
De reden waarom de plaatjes in een db moeten doet even niet ter zaken ;-)
mwoh, mij lijkt het toch verstandiger om eens te kijken naar een andere manier om je plaatjes op te slaan...

waarom moet het in de db?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mysql schijnt grote hoeveelheden blobdata niet fijn te vinden.

15GB aan blobdata vind ik ook wel heel veel voor een simpele db als mysql.
Sterker nog, als je geen innodb gebruikt kan, afhankelijk van je FS, mysql niet eens meer dan 2 of 4GB data opslaan...
En als je geen innodb gebruikt wordt bij elke select die complete 15GB tabel gelocked.

Er zijn maar weinig goede redenen waarvoor je dit in een database zou moeten zetten.

En als ik het dan al in een DB moest zetten zou ik het liever in een oracle achtige BFile zetten dan in een Blob.
Postgres heeft er een LOB voor (die worden als files opgeslagen).

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 26-03 22:36
INderdaad, waarom dataopslag door een relationele database laten doen. Met de goede tools is een file system voor grote hoeveelheden data een veel betere "database". Verschil is dat een filesystem een hierarchische structuur heeft en geen relationele.

Sowieso is het algemeen gezien idioot om binaire data in een database op te slaan. Welk relationeel verband kun je er op leggen? Niks. Ja je kan het koppelen aan een ID. Maar wat is het nut daarvan? Een nummertje met een klont data eraan gekoppeld. Je hele DB gaat van de hoeveelheid data over de zeik, maakt niet uit welk DBMS je hebt. Jippie, je moet in je programma ook weer anders omgaan met al die data, prut komt als een binaire stroom binnen, dus alle data moet direct in het systeemgeheugen/swap opgeslagen worden. Je applicatie zuipt geheugen.

En waarvoor? Ben ik erg benieuwd naar. ;) Als je echt een gegronde reden hebt dan wil ik die wel is horen.

Verwijderd

De Blob data zijn pdf bestanden. In totaal zal het aantal per jaar toenemen met 400.000 stuks. Ik denk niet dat dit mogelijk is op een standaard filesysteem. Er zijn mogelijkheden met b.v. JFS ( journaled file system ) maar dit is volgens mij ook een databaseachtig concept. Kortom het aantal bestanden zal het probleem worden als ik geen database ga gebruiken.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 03-04 19:24

gorgi_19

Kruimeltjes zijn weer op :9

400.000 bestanden te veel? Ik ben benieuwd, zie nu op de 300.000... ;) Was het probleem niet dat er een maximum aantal bestanden in een directory paste?

edit:

Hmm. Poster onder mij ietsie duidelijker > Oplossing is inderdaad dus meerdere directory's

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Defspace
  • Registratie: Mei 2000
  • Laatst online: 14-03 12:06

Defspace

Administrator

De Blob data zijn pdf bestanden. In totaal zal het aantal per jaar toenemen met 400.000 stuks. Ik denk niet dat dit mogelijk is op een standaard filesysteem. Er zijn mogelijkheden met b.v. JFS ( journaled file system ) maar dit is volgens mij ook een databaseachtig concept. Kortom het aantal bestanden zal het probleem worden als ik geen database ga gebruiken.
Niet als je b.v. voor iedere week/maand een apparte directory aan maakt ? Desnoods iedere dag een nieuwe directory. /docs/08072002/nieuw.pdf

  • eth0
  • Registratie: Mei 2002
  • Laatst online: 15-09-2025
Op zaterdag 06 juli 2002 22:44 schreef dr2epacs het volgende:
Ik verwacht een toenamen van 15 GB ( yip ... 1500 MB ) aan data per jaar.
1500 MB = 1.5 GB
15000 MB = 15 GB

Dus wat bedoel je nou :?
scheel nog al veel en ik denk als je 15 GB dat je dan de load misschien wel over meerde databases moet gaan verdelen of is het alleen input en worden er niet zoveel queries gedaan. dan valt het namelijk nogal mee.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 28-03 23:48

Gerco

Professional Newbie

Op maandag 08 juli 2002 10:02 schreef Defspace het volgende:
Niet als je b.v. voor iedere week/maand een apparte directory aan maakt ? Desnoods iedere dag een nieuwe directory. /docs/08072002/nieuw.pdf
Persoonlijk zou ik dan hiervoor gaan:
/pdfjes/2002/07/08/20020708<volgnummer>.pdf

Op die manier kun je ook direct 1 docje opzoeken zonder te gaan zoeken in de bestandsnamen, je hebt in feite hetzelfde als een uniek ID in een database, alleen werkt het dan waarschijnlijk iets beter. Voordeel is ook (in *NIX iig) dat je gewoon per jaar/maand een andere schijf kan mounten oid en je hebt nergens last van.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Hydra
  • Registratie: September 2000
  • Laatst online: 22-01 13:59
Op maandag 08 juli 2002 10:30 schreef Gerco het volgende:

Persoonlijk zou ik dan hiervoor gaan:
/pdfjes/2002/07/08/20020708<volgnummer>.pdf
Liever:
/pdfjes/2002/07/08/<volgnummer>.pdf

Als volgnummer kun je IMHO het beste de auto-insert ID uit je DB gebruiken. Heb je ook geen gezeur met conflicterende IDs.

https://niels.nu


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 08 juli 2002 09:54 schreef ShockWave het volgende:
Er zijn mogelijkheden met b.v. JFS ( journaled file system ) maar dit is volgens mij ook een databaseachtig concept. Kortom het aantal bestanden zal het probleem worden als ik geen database ga gebruiken.
Klok, klepel? :)

Wat heeft een journaling filesystem met efficiente opslag te maken? :)
De klepel zou wel eens 'reiserfs' kunnen zijn, dat de boel efficienter opslaat als het kleine en veel files zijn dan bijv ext2/3 in linux.
Echter dit fs komt ook echt niet verder dan de 64K files in 1 dir, dan wordt het ondoenlijk traag om es wat te verwijderen (ja, praktijk test ;) )

Alle fs-en hebben wel trekjes van databases en alle databases wel trekjes van fs-en, de nadruk ligt bij files alleen meer op efficiente opslag (en rechtstreekse toegang) en bij databases meer op efficiente (random/via meerdere 'ingangen') toegang.
Een journaling filesystem heeft nog iets meer db-trekjes doordat het een soort commit/undo log bijhoudt (de journal) wat transactie-ondersteunende db's ook (vaak?) doen.

JFS is overigens de afkorting van IBM's journaled filesystem :)
Op maandag 08 juli 2002 16:22 schreef Hydra het volgende:
Als volgnummer kun je IMHO het beste de auto-insert ID uit je DB gebruiken. Heb je ook geen gezeur met conflicterende IDs.
Wat let je om daar een key ala "YYYYmmddvvvv" voor te gebruiken? :)
(ok, autoincrement van mysql ;) )
Dat het niet nodig is is wat anders :)

Verwijderd

Topicstarter
Opnieuw : Ieder jaar wordt er 15 GB aan data opgeslagen. Deze data bestaat uit ongeveer 400.000 PDF bestanden.

In heb ooit een project gedaan op een Windows NT machine met veel bestanden. Door de grote hoeveelheid bestanden waren de toegangstijden bij het openen van een bestand opgelopen tot minuten. Ik weet dat we hier praten over Linux maar ik ben nog steeds een beetje bang voor gelijksoortige problemen ( vandaar ook de vraag over de blob ) ?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 28-03 23:48

Gerco

Professional Newbie

Dan moet je ook meerdere partities/schijven gebruiken. 400.000 bestanden op 1 partitie of in 1 dir (kan dat wel?) gaat inderdaad niet bepaald lekker lopen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • ycode
  • Registratie: Februari 2000
  • Laatst online: 01-03 16:15
MySQL is een database die z'n bestanden ook op een filesystem neerzet. Het zoeken naar een BLOB zal misschien sneller zijn, maar je moet alsnog de data van de server afhalen en naar de client sturen.

Daarnaast is het zo, dat _als_ je naar een andere database toe moet, dat die database een blob op een andere manier opslaat als dat MySQL dat doet, en dat betekent een aardige omschrijfactie. Ik denk dat het aan te bevelen is, om een stresstest uit te voeren, door dummydata in te voeren en, gebasseerd op deze ervaringen je eigen mening zal moeten vormen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 03-04 19:24

gorgi_19

Kruimeltjes zijn weer op :9

Op dinsdag 09 juli 2002 07:49 schreef dr2epacs iets:
Ik begin zo een vaag vermoeden te krijgen dat we hier op deze manier niet uitkomen. De meeste posters zijn het eens met het idee van "Sla alleen de link op in de db en het feitelijke bestand op je FS". Jij voorziet hier alleen enige problemen mee.

De enige methode om dit op te lossen is dan:
Maak 400.000 bestanden (of ietsie minder, naar gelang de serieusheid van de test), samen ongeveer een grootte van 15GB (Hier is heel eenvoudig een programmaatje voor te schrijven dat een bestand heel vaak kopieerd volgens een bepaald principe) Maak vervolgens de 400.000 records aan in de db (zelfde principe, ook programmaatje voor schrijven)

Draai vervolgens een stresstest en kijk of de uitkomsten acceptabel zijn.

Vervolgens stop je de 400.000 bestanden als blob in de db en doe je de test opnieuw.

Om het, ook voor de toekomst, eenvoudig te maken om de structuur te wijzigen, kan je (in ieder geval dit stukje) ontwikkelen volgens het 3-tier principe.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 09 juli 2002 07:56 schreef Gerco het volgende:
Dan moet je ook meerdere partities/schijven gebruiken. 400.000 bestanden op 1 partitie of in 1 dir (kan dat wel?) gaat inderdaad niet bepaald lekker lopen.
400.000 files in een dir zal niet zo lekker werken...
(afhankelijk van het fs _kan_ het niet eens geloof ik)

Maar als je een leuke zoekboom hebt kom je aardig ver.
Jouw filestructuur bijvoorbeeld, dan heb je maar 400.000/(12*30) files per dir en 1.000-10.000 files kunnen de meeste fs-en wel behappen in een enkele dir.

Per partitie boeit werkelijk voor geen meter, de filestructuur en het aantal inodes/etc zijn dan alleen nog van belang (kan zijn dat Fat het niet zo leuk vindt).

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 20:27

pietje63

RTFM

400.000 pdf-jes per jaar? dat is een redelijke verzameling, (ik ben totaal niet nieuwsgierig hoe je daar aan komt) maar ok...

de discussie is een beetje uitgelopen op db vs fs; nou volgens mij is geen van beide fijn werken, maar ik denk dat fs het toch wel wint van de db, om de simpele reden dat de db ook op het fs moet staan, en hij door evenveel records moet zoeken/bladeren als het fs door bestanden moet bladeren. en volgens mij is het werken met kleine (de losse pdfjes) bestanden dan altijd sneller dan met grote (de hele db)

maar ik weet het niet zeker

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Interessante discussie. Ik heb op dit moment eenzelfde probleem. Ik moet 1,2 miljoen plaatjes (a 35k) per jaar opslaan.
Ik heb de volgende keuze :
- Sybase en een filesysteem
- Oracle en plaatjes in database
- Oracle en filesystem.

Probeer hier maar eens een goed antwoord op te vinden ...
Wie heeft er nog tips ?

woei!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 09 juli 2002 19:27 schreef PaszWerken het volgende:
Keuze 1 en 3 zullen weinig uitmaken tov elkaar, dat is een keuze die je niet op basis van de db ansich moet maken, maar op de rest van de applicaties etc :)

Oracle en Sybase kennen volgens mij ook beiden manieren om blob's op te slaan, Oracle kan dan iig ook nog met BFILE's werken en wat Sybase daarvoor nog doet weet ik niet.
Als je echt een antwoord op deze vraag wilt zul je het moeten benchmarken, ik zelf ben wel geinteresseerd in het antwoord, maar kan het je niet geven :)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 28-03 23:48

Gerco

Professional Newbie

Op dinsdag 09 juli 2002 09:49 schreef ACM het volgende:
Per partitie boeit werkelijk voor geen meter, de filestructuur en het aantal inodes/etc zijn dan alleen nog van belang (kan zijn dat Fat het niet zo leuk vindt).
Aangezien hij al gepost had dat 400.000 files op 1 schijf niet goed liep, zou het beter lopen als je die files verdeelt over meerdere schijven (of partities dus).

Blijkbaar gebruikt hij een filesystem wat daar wel gevoelig voor is, dus je opmerking raakt kant noch wal :P (al heb je natuurlijk wel gelijk, maar dat is nu niet van toepassing).

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 25-03 13:05

Killemov

Ik zoek nog een mooi icooi =)

Op dinsdag 09 juli 2002 19:27 schreef PaszWerken het volgende:
Interessante discussie. Ik heb op dit moment eenzelfde probleem. Ik moet 1,2 miljoen plaatjes (a 35k) per jaar opslaan.
Ik heb de volgende keuze :
- Sybase en een filesysteem
- Oracle en plaatjes in database
- Oracle en filesystem.

Probeer hier maar eens een goed antwoord op te vinden ...
Wie heeft er nog tips ?
Ik zou zelf voor de tweede kiezen. Weet je wie er echt zitten te springen om die vraag van jou te mogen beantwoorden? Juist ja, de sales-people van Sybase en Oracle! Ik ben er ook alweer even uit en ik weet niet wat IBM met Informix heeft gedaan, maar dat werke me toch een partij fantastisch! Gewoon even een virtueel file-systeem in een database nabouwen. Misschien zijn ze nu al zover dat je je java app met een select kan opstarten.

Hey ... maar dan heb je ook wat!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 09 juli 2002 21:28 schreef Gerco het volgende:
Aangezien hij al gepost had dat 400.000 files op 1 schijf niet goed liep, zou het beter lopen als je die files verdeelt over meerdere schijven (of partities dus).

Blijkbaar gebruikt hij een filesystem wat daar wel gevoelig voor is, dus je opmerking raakt kant noch wal :P (al heb je natuurlijk wel gelijk, maar dat is nu niet van toepassing).
Ik heb wat lopen spelen met deze scriptjes:
files.php:
PHP:
1
<?        function getmicrotime()        {                list($usec, $sec) = explode(" ",microtime());                return ((float)$usec + (float)$sec);        }        `mkdir -p filetest`;        for($i = 0; $i < 1000; $i++)        {                `mkdir -p filetest/$i`;                echo "Doing files $i ";                flush();                $start = getmicrotime();                for($j = 0; $j < 1000; $j++)                {                        touch("filetest/$i/$j");                }                $end = getmicrotime();                echo "Took: " . number_format(($end - $start), 3) . " s \n";        }?>

open.php:
PHP:
1
<?        function getmicrotime()        {                list($usec, $sec) = explode(" ",microtime());                return ((float)$usec + (float)$sec);        }        for($i = 0; $i < 100; $i++)        {                echo "Selecting files $i ";                flush();                $start = getmicrotime();                for($j = 0; $j < 100; $j++)                {                        $x = rand(0, 9);                        $y = rand(0, 999);                        file("filetest/$x/$y");                }                $end = getmicrotime();                echo "Took: " . number_format(($end - $start), 3) . " s \n";        }?>

De code is dusdanig simpel dat hetzelfde in C vast sneller, maar niet 'beter' testen is :)

Bevindingen:
Per file kost het net zoveel tijd om de eerste 1000 te maken als de laatste 1000 (de 999000 tm 999999 dus)
Een miljoen files leverde me geen crash op, zelfs nu heb ik nog één miljoen inodes vrij.
Ik weet dat de files leeg waren, ik had er ook random data in kunnen schrijven, maar dan had mijn schijf het kwa ruimte niet leuk gevonden :)
Als ik uit _alle_ files random selecteerde kostte het uiteraard meer tijd dan uit slechts de eerste 10.000, dit omdat de boel dan niet zo netjes in de filecaches zat.
Het kostte echter NIET meer tijd om de eerste 10.000 files te random-accessen met 10.000 of 1.000.000 files in totaal.

Owja, doe dit niet met een creatie-regel ala `touch filenaam` ;) dan duurt het ipv 0.15 seconde per 1000 files ineens 5 seconde per 1000 files (leuk dat forken ;) ).

Gebruikte software en hardware:
Gentoo linux met een 2.4.19-optimised kernel en alle libs i686 optimised.
php-4.2.1 optimised voor i686 in de commandline (bash 2.0.5a) op een athlon 850 + 512MB ddr-ecc-sdram + 20GB 7200rpm wd-ide-schrijf.

Ik zal het eens testen met files van 4KB oid als iemand daar interesse in heeft, maar ik verwacht geen spectaculaire verschillen (ja het zal slomer zijn ;) ).
Een zelfde vergelijking op mysql uithalen zal interessanter zijn (maar dan moet de file wel data bevatten ;) )

Owja, de conclusie:
Een goed fs op een goed os kan makkelijk meer dan 400.000 files aan, als je het maar netjes in dirs organiseert.
Als het goed dat voor zowel linux, freebsd, etc, etc als ook windows 2000/XP met ntfs

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ok, ik wilde het toch weten:
mysql+blob vs mysql+fs

Testphp:
PHP:
1
<?        require('connect.php');        $number_of_files = 10;        $number_of_tests = 10;        mysql_query("drop table filestorage");        mysql_query("drop table dbstorage");        mysql_query("create table dbstorage(id integer not null primary key auto_increment, data mediumblob);");        mysql_query("create table filestorage(id integer not null primary key auto_increment, location varchar(255));");        `rm -rf test/`;        `mkdir -p test/`;        `dd if=/dev/zero of=1mbfile count=4096 bs=1024 2>/dev/null` // Creeer 4MB bronfile gevuld met 0-en.        function getmicrotime()        {                list($usec, $sec) = explode(" ",microtime());                return ((float)$usec + (float)$sec);        }        function createfsfile($number, &amp;$filldata)        {                // Write out the data the file.                $fp = fopen('test/file' . $number, 'w') or die("Unable to open file for writing");                fwrite($fp, $filldata);                fclose($fp);                $query = "INSERT INTO filestorage (location) VALUES ('$number')";                mysql_query($query) or print("Create FS insert failed: " . mysql_error());        }        function createdbfile($number, &amp;$filldata)        {                // Escape the data and insert it.                $query = "INSERT INTO dbstorage (data) VALUES ('" . mysql_escape_string($filldata) . "');";                mysql_query($query) or die("Create DB insert failed: " . mysql_error());        }        function readfsfile($number)        {                $query = "SELECT location FROM filestorage WHERE id = $number";                $result = mysql_query($query) or die("FS select failed: " . mysql_error());                $row = mysql_fetch_row($result);                mysql_free_result($result);                $fp = fopen('test/file' . $row[0], 'r') or die("Unable to open file for reading");                $data = '';                while(!feof($fp))                        $data .=fread($fp, 8192);                fclose($fp);                return strlen($data);        }        function readdbfile($number)        {                $query = "SELECT data FROM dbstorage WHERE id = $number";                $result = mysql_query($query) or die("FS select failed: " . mysql_error());                $row = mysql_fetch_row($result);                mysql_free_result($result);                return strlen($row[0]);        }        // Read 1MB file        $filldata = '';        $fp = fopen('1mbfile', 'r') or die("unable to open file");        while(!feof($fp))                $filldata .= fread($fp, 8192);        fclose($fp);        // Create $number_of_files files on FS.        echo "Creating $number_of_files files on the FS\n";        $starter = getmicrotime();        for($i = 0; $i < $number_of_files; $i++)        {                echo "Doing files $i ";                $start = getmicrotime();                createfsfile($i, $filldata);                $end = getmicrotime();                echo "Took: " . number_format(($end - $start), 3) . " s \n";        }        $ender = getmicrotime();        echo "Total procedure took: " . number_format(($ender - $starter), 3) . " s \n";        // Create $number_of_files files in DB.        echo "Creating $number_of_files files in the DB\n";        $starter = getmicrotime();        for($i = 0; $i < $number_of_files; $i++)        {                echo "Doing files $i ";                $start = getmicrotime();                createdbfile($i, $filldata);                $end = getmicrotime();                echo "Took: " . number_format(($end - $start), 3) . " s \n";        }        $ender = getmicrotime();        echo "Total procedure took: " . number_format(($ender - $starter), 3) . " s \n";        // Free 1MB data blob of zero's :)        unset($filldata);        // Select a $number_of_tests random files, read them from both the FS and the DB.        echo "Selecting $number_of_tests files randomly from the DB's\n";        $totalfstime = 0;        $totaldbtime = 0;        $starter = getmicrotime();        for($i = 0; $i < $number_of_tests; $i++)        {                $x = rand(1, $number_of_files);                echo "Selecting $i: file $x ::";                $start = getmicrotime();                $fslen = readfsfile($x);                $end = getmicrotime();                echo "fs: " . number_format(($end - $start), 3) . " s ";                $totalfstime += ($end - $start);                $start = getmicrotime();                $dblen = readdbfile($x);                $end = getmicrotime();                echo "db: " . number_format(($end - $start), 3) . " s ";                $totaldbtime += ($end - $start);                echo "\n";        }        $ender = getmicrotime();        echo "Total procedure took: " . number_format(($ender - $starter), 3) . " s \n";        echo "Total FS time: " .  number_format($totalfstime, 3) . " s \n";        echo "Total DB time: " .  number_format($totaldbtime, 3) . " s \n";?>

Vergeet niet een connect.php te maken met een mysql_connect en een mysql_select_db.
Heb ook minstens 100MB vrije schijfruimte en liefst meer ;)

De output van dit script met de params zoals hier:
Creating 10 files on the FS
Doing files 0 Took: 0.079 s
Doing files 1 Took: 0.094 s
Doing files 2 Took: 0.080 s
Doing files 3 Took: 0.078 s
Doing files 4 Took: 0.077 s
Doing files 5 Took: 0.078 s
Doing files 6 Took: 0.077 s
Doing files 7 Took: 0.079 s
Doing files 8 Took: 0.077 s
Doing files 9 Took: 0.077 s
Total procedure took: 0.800 s
Creating 10 files in the DB
Doing files 0 Took: 0.868 s
Doing files 1 Took: 0.859 s
Doing files 2 Took: 1.571 s
Doing files 3 Took: 2.707 s
Doing files 4 Took: 0.870 s
Doing files 5 Took: 1.001 s
Doing files 6 Took: 2.021 s
Doing files 7 Took: 0.868 s
Doing files 8 Took: 0.859 s
Doing files 9 Took: 0.862 s
Total procedure took: 12.490 s
Selecting 10 files randomly from the DB's
Selecting 0: file 4 ::fs: 0.074 s db: 1.775 s
Selecting 1: file 6 ::fs: 0.041 s db: 0.204 s
Selecting 2: file 9 ::fs: 0.044 s db: 0.183 s
Selecting 3: file 4 ::fs: 0.044 s db: 0.179 s
Selecting 4: file 5 ::fs: 0.043 s db: 0.179 s
Selecting 5: file 8 ::fs: 0.043 s db: 0.177 s
Selecting 6: file 3 ::fs: 0.040 s db: 0.175 s
Selecting 7: file 8 ::fs: 0.041 s db: 0.169 s
Selecting 8: file 7 ::fs: 0.040 s db: 0.174 s
Selecting 9: file 3 ::fs: 0.040 s db: 0.176 s
Total procedure took: 3.855 s
Total FS time: 0.450 s
Total DB time: 3.391 s
De inserts die 2seconden kostten waren mede te wijten aan filesystem-syncs/flushes. Ook bij de fs-creatie waren die er wel.

Resultaat lijkt me duidelijk, veel plezier met testen met grotere/andere waarden :)
Ow nog een nadeel van mysql, door het client-protocol kan het geen rows/queries groter dan 16MB aan, dus ook geen files groter dan 16MB inserten/updaten/selecten, ook al is er de largeblob van 2GB ...

  • Hydra
  • Registratie: September 2000
  • Laatst online: 22-01 13:59
Op maandag 08 juli 2002 17:39 schreef ACM het volgende:

Wat let je om daar een key ala "YYYYmmddvvvv" voor te gebruiken? :)
(ok, autoincrement van mysql ;) )
Dat het niet nodig is is wat anders :)
Och, het maakt op zich niet veel uit, maar 400000 PDF-jes per jaar = 1095 PDF-jes per dag. Da's gemiddeld 0,45 per minuut. Als je files dan als YYYYMMDDHHMMSS.pdf opslaat is er IMHO een kans op collisions. Een auto-insert ID is gegarandeerd uniek, en bovendien is de bestandsnaam dan waarschijnlijk korter.

/pdf/yyyy/mm/dd/xxxxxxx.pdf lijkt me dus de perfecte oplossing :D

https://niels.nu


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Ok, het lijkt me duidelijk dat het een filesytem moet worden. Kan iemand iets vertellen over maximale aantallen rows en files ?

woei!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 11:28 schreef PaszWerken het volgende:
Ok, het lijkt me duidelijk dat het een filesytem moet worden. Kan iemand iets vertellen over maximale aantallen rows en files ?
Das een beetje een loze vraag zo...
Maximale rows waarin?

Als je een smallint primairy key hebt zijn dat er 64K, als je een bigint prim key hebt zijn het er in principe 2^64, afhankelijk van je capaciteit en ook een beetje afhankelijk van je DB. Voor elke DB kan je op de infopages/manuals/sites/etc wel vinden wat ze aan max-rows per tabel accepteren.

Maximaal aantal files is bij een unix filesystem als ext2/ext3 vooral gebonden aan het aantal inodes dat er op kan, hoe groter de disk hoe meer inodes en over het algemeen heb je er daar zat van, zelfs voor 400.000 files per jaar.
Voor ntfs weet ik dat niet, er zijn trouwens vast wel vergelijkende sites die ook daar een overzicht van geven :)

Verwijderd

/pdf/yyyy/mm/dd/xxxxxxx.pdf lijkt me dus de perfecte oplossing :D
Niet als je alle pdf'jes op dezelfde dag post :Y)
Maar aangezien we (waarschijnlijk) over een grote hoeveelheid onafhankelijke acties praten, is de kans daarop natuurlijk niet zo groot. :)

Je kan ook alles netjes over de directories verdelen door een twee diepe structuur te nemen, waarbij je per directory X files plaatst. Een file met nummer Y (bijvoorbeeld verkregen door de autonummering) zet je dan in directory (int) Y / X. Wanneer je een pdf'je verwijdert (en de overeenkomende database record) en weer een nieuwe invoegt, dan kan hiervoor het vorige nummer hergebruikt worden, en komt deze ook weer netjes in de directory structuur terecht.
Je hoeft dan verder ook geen bestandspaden in je database op te slaan, alleen een nummertje.

In geval dat je aantallen files zo groot worden dat een twee diepe structuur te weinig is, kan je ook nog drie diep gaan zonder je nummers te hoeven veranderen... of eventueel op andere partities/schijven.

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

zo, ik herken me behoorlijk in de topicstarter.

ik heb een database waar ook plaatjes in komen (a 40 kb).
Als ik de zooi door liet lopen nam de db PER jaar met zo'n 125 GB toe.... Nu heb ik elke 3 uur al een opschoon tool lopen, waardoor de totale grootte zo'n 700 MB blijft (CONTINUE...).

echter, je ziet het al: als de tool loopt, is de ganse tabel gelocked (myisam). dit duurt meestal zo'n 15 minuten.

en ik mag de plaatjes _NIET_ opslaan op de HD. heb al genoeg onenigheid met de manager daarover gehad, dus dat is geen optie.
Zou het aan te raden zijn om over te gaan op InnoDB?

nope


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 28-03 23:48

Gerco

Professional Newbie

Op woensdag 10 juli 2002 13:16 schreef bloody het volgende:
en ik mag de plaatjes _NIET_ opslaan op de HD. heb al genoeg onenigheid met de manager daarover gehad, dus dat is geen optie.
Zomaar even uit nieuwsgierigheid.. waarom mag je de plaatjes niet op HD zetten? Als ze in de DB zitten staan ze ook op de db... ik begrijp niet waarom dat een probleem is.

Aangezien jij het er met je manager over gehad heeft, weet je vast wel een paar argumenten om geen filesystem, maar een DB te gebruiken.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

Op woensdag 10 juli 2002 13:19 schreef Gerco het volgende:

[..]

Zomaar even uit nieuwsgierigheid.. waarom mag je de plaatjes niet op HD zetten? Als ze in de DB zitten staan ze ook op de db... ik begrijp niet waarom dat een probleem is.

Aangezien jij het er met je manager over gehad heeft, weet je vast wel een paar argumenten om geen filesystem, maar een DB te gebruiken.
argument van hem: dan is de boel consistent: dus als een plaatje weg moet, kan dit met 1 query, en is zowel het plaatje als info over het plaatje weg.
argumenten van mij: lijkt me logisch (bv: db traag,max grootte (2 GIG in mijn geval), enz)

hij is er simpelweg niet vatbaar voor, en weigert iedere vorm van discussie daarover. Hij zegt: "je doet het zoals ik het wil".
Tja, dan ik de kous gauw af he!

nope


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Lekkere manager heb je dan bloody :r

Ik ben waarschijnlijk gebonden aan een Sybase database. Met wat stored procedures moet het mogelijk zijn om mn database consistent te houden, door een DELETE af te vangen het daar het bijbehorende plaatjes te verwijderen.

Toch eens kijken of er een maximaal aantal rijen is in sybase, anders zal ik toch een opschoon script eraan moeten hangen.

woei!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 13:44 schreef PaszWerken het volgende:
Toch eens kijken of er een maximaal aantal rijen is in sybase, anders zal ik toch een opschoon script eraan moeten hangen.
Dat is er vast wel, maar ga er maar vanuit dat Sybase geen moeite heeft met DB's van TB's :)
Zolang je hardware het aankan natuurlijk :P
Op woensdag 10 juli 2002 13:22 schreef bloody het volgende:
sinds wanneer houdt een manager zich met implementatie bezig :?

Magoed, de consistency is het enige argument _voor_ een db volgens mij.
Als je met oracle oid werkt kan je nog naar bfiles kijken, maar er is toch altijd een zinloze (?) extra laag die de performance nooit ten goede komt.

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

Op woensdag 10 juli 2002 14:03 schreef ACM het volgende:

sinds wanneer houdt een manager zich met implementatie bezig :?

Magoed, de consistency is het enige argument _voor_ een db volgens mij.
Als je met oracle oid werkt kan je nog naar bfiles kijken, maar er is toch altijd een zinloze (?) extra laag die de performance nooit ten goede komt.
omdat dat een manager is die vanuit de techniek komt en dat niet kan loslaten.

enne, ik gebruik mysql.

nope


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 14:10 schreef bloody het volgende:
enne, ik gebruik mysql.
[beetje-flame/troll-intended]
Dan is consistency ook geen argument, want daar kan mysql zelf geen zorg voor dragen... :+
[/beetje-flame/troll-intended]

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Toch eens kijken wanneer MySQL stored procedures gaat ondersteunen.

woei!


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

Op woensdag 10 juli 2002 14:51 schreef PaszWerken het volgende:
Toch eens kijken wanneer MySQL stored procedures gaat ondersteunen.
vanaf 4.1 ofzo

nope


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Oepz. Duurt nog effies ...
The planned update language will be able to handle stored procedures. Our aim is to have stored procedures implemented in MySQL Server around version 5.0. We are also looking at triggers.

woei!


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

Op woensdag 10 juli 2002 15:17 schreef PaszWerken het volgende:
Oepz. Duurt nog effies ...
[..]
hmm dan is dat verschoven.

nope


Verwijderd

Topicstarter
Het moge duidelijk zijn dat we het beste voor opslag op harddisks moeten gaan. Natuurlijk niet op windows want dat wordt het bij een paar duizend files al langzamer. Komen we meteen bij de volgende vraag : welk filesystem is dan het beste ( deze vraag hoort hier niet thuis maar is wel een logisch vervolg !? ) raiser of een ander fs ??

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 16:03 schreef dr2epacs het volgende:
Het moge duidelijk zijn dat we het beste voor opslag op harddisks moeten gaan. Natuurlijk niet op windows want dat wordt het bij een paar duizend files al langzamer.
Een gemiddelde windows installatie bevat al gauw 100.000 files of meer.
Denk dat je wel tegen problemen aan loopt als je het met Fat probeert, maar NTFS zou prima moeten werken.
Komen we meteen bij de volgende vraag : welk filesystem is dan het beste ( deze vraag hoort hier niet thuis maar is wel een logisch vervolg !? ) raiser of een ander fs ??
Dat heet nog altijd 'reiserfs' :)

Er zijn in linux een aantal filesystems de moeite van het bekijken waard:
reiserfs
ext2/3 (geen reden om 3 niet te nemen als je voor 2 kiest)
XFS
JFS

Je zult zelf even de voor en nadelen op moeten zoeken, mijn tests (ook die met een miljoen files) waren allemaal op ext3.
reiserfs is geloof ik vooral bruikbaar als je veel kleine files hebt, xfs en jfs ken ik nauwelijks.

  • bloody
  • Registratie: Juni 1999
  • Laatst online: 22:45

bloody

0.000 KB!!

hint: sla de vorige c't eens open: daar staat een leuke vergelijking tussen diverse fs'en in.

zelf heb ik goede ervaring met reiserfs. Maar dan wel op de nieuwste kernel 2.4.18. Daarvoor wou ie nog wel eens in de soep draaien.

nope


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Ik zit te denken aan een aparte plaatjes webserver.
Een linux bak die echt alleen plaatjes served. Ben effies kwijt hoe die ene webserver heet die je in je kernel mee kan compileren...

woei!


  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Op woensdag 10 juli 2002 19:07 schreef PaszWerken het volgende:
Ik zit te denken aan een aparte plaatjes webserver.
Een linux bak die echt alleen plaatjes served. Ben effies kwijt hoe die ene webserver heet die je in je kernel mee kan compileren...
Bedoel je Tux?

On track


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 19:07 schreef PaszWerken het volgende:
Ik zit te denken aan een aparte plaatjes webserver.
Een linux bak die echt alleen plaatjes served. Ben effies kwijt hoe die ene webserver heet die je in je kernel mee kan compileren...
Tux van redhat
khttpd (zit er standaard bij)
boa (geen kernel module)

Al 3 opties van lowweight httpd's :)

  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Is de beveiliging van de bestanden (plaatjes/documenten) misschien een argument om ze in een database te stoppen?

Stel dat je algemene (voor iedereen) en persoonsgebonden (voor een specifieke groep) documenten hebt of zoiets dan zou je naast de beveiliging in je database ook de beveiliging in je filesysteem moeten gebruiken en dat lijkt mij niet echt wenselijk.
Of is daar ook een oplossing voor?

Verwijderd

Topicstarter
Je hoeft de files niet "open" onder de webroot te zetten. PHP scripts kunnen de file streamen na de gebruiker vanuit (voor het web afgeschermde) directories. Eventuele authorisatie kan het script verder ook voor zijn rekening nemen. Ik denk niet dit dit een argument is om een database te kiezen

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 10 juli 2002 20:15 schreef Lister het volgende:
Of is daar ook een oplossing voor?
Dat is allemaal wel op te lossen.

Zolang we het over webapplicaties hebben en er geen directe toegang tot de filesystems van de server is is de uitleg hier voor me ruim voldoende :)

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Op woensdag 10 juli 2002 16:03 schreef dr2epacs het volgende:
Het moge duidelijk zijn dat we het beste voor opslag op harddisks moeten gaan.
[flauw]Tja, je kan het natuurlijk ook in het geheugen proberen te proppen... :z[/flauw]

Pas de replâtrage, la structure est pourrie.


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Ik dacht dat tweakers.net ook voor een gedeelte op Tux draaide, maar kan het even niet meer vinden waar dat staat.

RedHat ken ik niet zo goed. Alleen met Debian kan ik aardig uit de voeten (APT-GET !).

Zou je voor de zekerheid dan ook een ander FS moeten kiezen ?

woei!


  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
klein schopje

woei!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 11 juli 2002 02:10 schreef PaszWerken het volgende:
Ik dacht dat tweakers.net ook voor een gedeelte op Tux draaide, maar kan het even niet meer vinden waar dat staat.
Nee, met boa.

Tux heb ik nooit op een non-redhat aan de praat geprobeerd te krijgen, op een redhat-systeem werkte het iig goed.
Zou je voor de zekerheid dan ook een ander FS moeten kiezen ?
Een ander?
Anders dan wat?

Volgens mij kan je prima uit de voeten met ext3 en anders kan je nog es kijken naar XFS of reiserfs.

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Huh. Dus boa doet alle statische inhoud ?

woei!


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 11 juli 2002 15:02 schreef PaszWerken het volgende:
Huh. Dus boa doet alle statische inhoud ?
Veel ja, hoezo?
Die doet dat wel een heel stuk efficienter dan apache hoor :)

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 20-03 22:01
Zoiets zocht ik dan ook ACM.
Dankie.

woei!

Pagina: 1