[php] groot xml bestand -> mysql

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Algemeen:
Ik zit met een xml bestand van 300MB en dat wil ik in een databank bewaren (MySQL). Het xml bevat een productenlijst, nu wil ik die productenlijst doorzoekbaar maken voor een website. Mij leek het sneller om het opzoeken via een databank te laten verlopen. Dat xml bestand wordt elke 24 uur upgedate, dus moet ik mijn databank om de 24u martelen. Het xml wordt mij aangeboden via een externe partij en het is niet mogelijk om het anders aangereikt te krijgen dan in xml.

Probleem:
Een product kan in het xml bestand maar 1 categorie hebben, dus als een product in meerdere categorieën thuis hoort staat het er meerdere keren in. Ik kan nu wel gerust alle producten doorlopen (sequentieel) en daarbij het product id vergelijken met dat van de databank, als het niet bestaat toevoegen en anders de gegevens vergelijken om te kijken of alles nog klopt. Nu zit ik met het probleem wat als de gegevens uit de databank veroudert zijn en niet meer voorkomen in het xml bestand.

Ik werk nu met php en gebruik eerst copy() om het xml bestand binnen te halen en vervolgens ga ik aan het werk met het DOMDocument. Ik merk echter dat domdocument er niet veel zin in heeft om zijn taak af te werken. Hij stopt er gewoon mee na een tijdje of hij begint er gewoon niet aan (cronjob, terwijl cronjob wel gestart is).

Ook verwerk ik de gegevens eerst nog, niet alles is even correct bvb typo's (als ik nu even currency van euro erbij neem zie ik dit staan: eu44r, eur4, e4ur, eu5r, eur3, eu2r als typefouten) Het is handig als je dit kunt opvangen in een apparte tabel :) Enzo heb ik nog wel een paar redenen waarom ik het in een databank wil stoppen.

Hoe zouden jullie het aanpakken? Ik zou met een update id kunnen werken, als een product niet mee geupdate is dus niet +1 is gegaan stond hij waarschijnlijk niet in het xml bestand. Maar het gaat al snel om een half miljoen records dus wil ik niet op elk record een operatie uitvoeren :? Wat raden jullie aan? Xquery? Xpath? Een ander alternatief waar ik nog niet aan gedacht heb?

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Misschien moet je eens kijken naar Pentaho Data Integration, dat is een stuk software dat gespecialiseerd is in dit spul: http://www.pentaho.com/products/data_integration/

Gratis te downloaden vanaf sourceforge overigens, moet je alleen iets beter zoeken ;)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Bedankt voor de snelle reactie :D
Ik ben nog vergeten te vermelden dat ik gebruik maak van een reseller account met cpanel, dus niets kan installeren. Net even Pentaho bekeken en het maakt gebruik van xpath (althans bij xml) dus zal ik ook even die richting in gaan. Ik ben eigenlijk niet op zoek naar externe software maar een manier om het te maken in php. Ik ben woonachtig in belgie dus een bestand van 300MB dagelijks binnen trekken om manueel (door middel van een programma) de verschillen te bekijken zou mij 30*300MB = 9000MB kosten van mijn 30GB limiet. Daar word ik niet bepaald vrolijk van.

[ Voor 24% gewijzigd door Precision op 21-08-2009 15:07 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

De beste methode om aan te geven of items nog wel bestaan in het bron xml bestand is iets als een 'updated at' veld erbij op te slaan. Sla daar gewoon op wanneer de data voor het laatst gewijzigd is en als het dus meer dan een dag oud is kan je er vanuit gaan dat de data niet meer bestaat :)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
Bedankt :-)
Nu zit ik nog met een ander probleem, wss dat dit apache is of ingesteld door de host. Maar als ik simplexml_load_file() of dom of dom xml, ofja eigenlijk gewoon vanaf dat ik het bestand aanspreek krijg ik geen output meer. Ook al staat er nu bij alles var_dump staat alles tussen try catch. In chrome krijg ik een 324 met live http headers krijg ik gwn 200 OK status zonder de verdere info het stopt na 1 regels 200 OK terwijl je er toch een kleine 10 anders hebt. Zoals voor deze pagina te refreshen:
HTTP/1.x 200 OK
Date: Fri, 21 Aug 2009 13:58:35 GMT
Server: Apache/2.2.9 (Debian) mod_ssl/2.2.9 OpenSSL/0.9.8g
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Fri, 21 Aug 2009 13:58:35 GMT
P3P: CP="CUR ADM OUR NOR STA NID"
Cache-Control: private, post-check=1, pre-check=2, max-age=1, must-revalidate
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=ISO-8859-15

Maar het stopt na HTTP/1.x 200 OK

Net even gekeken naar server load als ik het uitvoer en het gaat in het rood en dan stopt m'n script automatisch. Dusja auto abort ofzo iets :-(

[ Voor 6% gewijzigd door Precision op 21-08-2009 16:05 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
DOM is geen optie, die vreet vééél te veel geheugen. Waarschijnlijk werkt XMLReader nog het beste, die gaat regel voor regel de boel uitlezen. Wanneer je dat op de juiste manier doet, zal het snel zijn en weinig geheugen verbruiken.

Let er wel op dat XML Reader UTF8 gebruikt!!! Hierboven kom ik "charset=ISO-8859-15" al tegen...

Je kan ook overwegen om de database de XML te laten verwerken, maar ik weet niet of MySQL dat (eenvoudig) kan doen. In PostgreSQL is het niet moeilijk, maar XML blijft een geheugenmonster.

Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
bedankt, ik ben ermee aan de slag gegaan en het lijkt te werken, natuurlijk nog veel test werk. Maar het werkt, bedankt :-)

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?

Pagina: 1