Grote XML feed in database laden
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!
Door de XML feed na te maken(copy past) en dan in feeds van 50.000 records plaatsen?
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!
Ook kan je ze dan per regel opvragen ( fgetcsv() ) en per 1000 oid in je DB stoppen.
Bedankt voor de snelle reactie!
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.
Probeer ook eens 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?
Wat is groot? Hoeveel MB praten we over?
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 -
Het XML bestand is iets meer dan 182MB groot.
Qt (open-source versie), die hebben een heel makkelijke XML-interface.
Jens
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 Jens
Gewijzigd op 24/08/2010 13:54:02 door Jens V
Ik ga nu proberen bij hoeveel hij komt met een cronjob en of hij dus alle 250.000 records uitvoert.
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
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.
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!
Je kan een log bijhouden in een tekstbestandje, dan weet je wat er allemaal gebeurd.
Is dat mogelijk als ik de website host bij een hostingsbedrijf?