Grote XML feed in database laden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

M h

m h

24/08/2010 12:50:31
Quote Anchor link
Beste PHPhulp gebruikers,

Ik zit met een probleempje. Ik wil namelijk een XML productfeed in een mysql database inladen. Dit XML bestand bevat echter 250.000 producten. Als ik deze met een PHP script in probeer te laden krijg ik de melding 'Fatal error: Out of memory (allocated ...' etc.

Ik probeer het op dit moment op de volgende manier:
- Met file_get_contents laad ik de gehele XML in PHP in
- Met explode haal ik vervolgens alle records uit de XML
- De array die hieruit ontstaat probeer ik vervolgens met een foreach te doorlopen en stuk voor stuk de records in de database te zetten.

Het gaat echter fout in het explode gedeelte.

Heeft iemand een oplossing hoe ik 250.000 records uit een XML in een mysql databasetabel kan laden?

Alvast bedankt voor de hulp!
 
PHP hulp

PHP hulp

25/12/2024 10:07:35
 
Joakim Broden

Joakim Broden

24/08/2010 12:55:00
Quote Anchor link
Ehm misschien door het in meerdere keren te doen?

Door de XML feed na te maken(copy past) en dan in feeds van 50.000 records plaatsen?
 
M h

m h

24/08/2010 12:57:25
Quote Anchor link
Het probleem is dat het bestand alleen te downloaden is met 250.000 records. Het formaat van dit bestand is vervolgens te groot om te openen op de computer, met welk programma ook.
Daarnaast is het de bedoeling dat het via Cron-job automatisch elke dag geupdate word. Is er geen andere mogelijkheid in PHP bijvoorbeeld waarbij je ervoor zorgt dat hij de XML in stukjes verwerkt?

Alvast bedankt voor de reactie!
 
Pim -

Pim -

24/08/2010 13:06:51
Quote Anchor link
Kan je die data niet in CSV krijgen? Dat moet veel geheugen schelen.
Ook kan je ze dan per regel opvragen ( fgetcsv() ) en per 1000 oid in je DB stoppen.
 
M h

m h

24/08/2010 13:10:43
Quote Anchor link
Ik kan de bestanden inderdaad ook in csv krijgen. Ik zal eens proberen of ik er dan wel uit kom!
Bedankt voor de snelle reactie!
 
Jelmer -

Jelmer -

24/08/2010 13:15:17
Quote Anchor link
Probeer ook eens XMLReader, die net als fgetcsv door het bestand loopt. In tegenstelling tot DOM of SimpleXML, die het hele document in het geheugen proberen te laden.
 
M h

m h

24/08/2010 13:25:31
Quote Anchor link
oke, ben nog niet zo ervaren met PHP. Begrijp dan ook niet helemaal wat XMLReader doet of hoe het werkt. Werkt fgetcsv net zo goed? Dan gebruik ik die gewoon! Of heeft XMLReader voordelen boven fgetcsv?
 
Veur Heur

Veur Heur

24/08/2010 13:34:02
Quote Anchor link
Wat is groot? Hoeveel MB praten we over?
 
Jelmer -

Jelmer -

24/08/2010 13:50:56
Quote Anchor link
XMLReader is meer een tokenizer dan een parser. Je geeft hem een bestand en zegt "Volgende!" en dan zegt hij "dit is een tag met de naam 'datum'", en dan zeg jij weer "volgende!" en dan zegt hij weer "dit is een stukje tekst met blabla als inhoud" etc. In plaats van dat je dan die losse stukjes gebruikt om een boom te bouwen, gebruik je het om bijvoorbeeld een query klaar te maken en uit te voeren.

Maar als je niet zo thuis bent in PHP of in op die manier programmeren is fgetcsv waarschijnlijk makkelijker. Ook die werkt een beetje zoals XMLReader behalve dat die je een regel uit dat bestand teruggeeft in de vorm van een array met een entry voor ieder veld wanneer jij roept "volgende!".
Gewijzigd op 24/08/2010 13:51:50 door Jelmer -
 
M h

m h

24/08/2010 13:50:56
Quote Anchor link
Het XML bestand is iets meer dan 182MB groot.
 
Jens V

Jens V

24/08/2010 13:52:51
Quote Anchor link
Schrijf er een klein C++ programmatje voor die het in een lokale database zet. Vervolgens kan je die dumpen en in je online database zetten? Een programma heeft snel al wat meer rekenkracht dan PHP... Moest je da kunnen zou ik kijken naar Qt (open-source versie), die hebben een heel makkelijke XML-interface.

Jens
Gewijzigd op 24/08/2010 13:54:02 door Jens V
 
M h

m h

24/08/2010 13:53:34
Quote Anchor link
Ik krijg het nu wel voor elkaar inderdaad dat hij een voor een de csv regels doorloopt en in de database invoert. Ik weet alleen nog niet of hij stopt voordat alle 250.000 erin gezet zijn vanwege een timeout.
Ik ga nu proberen bij hoeveel hij komt met een cronjob en of hij dus alle 250.000 records uitvoert.
 
Jens V

Jens V

24/08/2010 13:54:47
Quote Anchor link
Een cronjob gaat ook gewoon dat php-script uitvoeren. Die gaat evenzeer een time-out krijgen.
Opolo Webdesign op 24/08/2010 13:59:23:
Je timeout zul je dan wat hoger moeten zetten maar draaien zal ie.

Tenzij je hem hoger zet natuurlijk :)

Jens
Gewijzigd op 24/08/2010 14:00:59 door Jens V
 
Veur Heur

Veur Heur

24/08/2010 13:59:23
Quote Anchor link
182! haha, peanuts! Ik importeerde bestanden van 2gb zonder problemen met xmlreader. Je timeout zul je dan wat hoger moeten zetten maar draaien zal ie.
 
M h

m h

24/08/2010 14:00:26
Quote Anchor link
Klopt, maar geloof dat de timeout daar pas na een half uur is bij mijn hosting als ik het goed gelezen heb... Ik probeer het gewoon even uit, kan geen kwaad;)

Toevoeging op 24/08/2010 14:07:32:

Kan ik de timeout zelf hoger zetten? Zo ja, hoe moet ik dat doen? Heb me website bij een hostingsbedrijf gehost.
Als dat namelijk ingesteld kan worden is mijn probleem opgelost!
Alvast bedankt voor de reacties!
 
Pim -

Pim -

24/08/2010 14:24:07
Quote Anchor link
Je kan een log bijhouden in een tekstbestandje, dan weet je wat er allemaal gebeurd.
 
M h

m h

24/08/2010 14:31:43
Quote Anchor link
Een log bijhouden? Het enige probleem waarmee ik nog zit is dat ik de timeout zou willen verlengen, dus dat een bestand langer uitgevoerd kan worden.
Is dat mogelijk als ik de website host bij een hostingsbedrijf?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.