Avatar billede fayyaz Nybegynder
02. november 2012 - 14:48 Der er 8 kommentarer

Hente data fra en stor XML fil (40GB)

Jeg er være få grå hår af det her, jeg håber der nogen der kan hjælpe med nedestående.

Jeg har en stor XML fil på ca. 40GB jeg skal hente data fra via et PHP script(skal være PHP).

Jeg har leget lidt med små XML filer med simplexml_load_file og det virker perfekt, MEN prøver jeg med den store 40GB fil så hænger det hele.

Nogen anbefalinger til hvad man kan gøre?

- Memorylimit er ikke en begrænsning.
- Det hele køre på eget server, rimlig heftig.

Hielfe! :)
Avatar billede olebole Juniormester
02. november 2012 - 16:46 #1
<ole>

40GB ...?!??!!! Det lyder næsten som at evakuere Manhatten med en ladcykel. Hvorfor ikke bruge en database?

/mvh
</bole>
Avatar billede scootergrisen Nybegynder
02. november 2012 - 17:28 #2
Prøv og læs PHP manualen med brugerkommentar ved de funktioner du bruger. Der kan være der står noget der med at bruge meget store filer.
Avatar billede fayyaz Nybegynder
02. november 2012 - 18:01 #3
Ole det en XML og sådan er det bare :-)
Scooter, jeg kigger der så :-)
Avatar billede olebole Juniormester
02. november 2012 - 18:21 #4
Ja, naturligvis er det sådan. Ellers havde du formodentlig skrevet noget andet i spørgsmålet. Men det betyder vel ikke, at der ikke er mulighed for at ændre på noget  =)

Én ting er i hverfald sikkert: SimpleXML er ikke en gangbar løsning. Det er næppe særlig realistisk at læse 40GB ind i hukommelsen. Prøv evt at kikke på XMLReader, som plejer at være bedre til at håndtere store XML-filer
Avatar billede fayyaz Nybegynder
02. november 2012 - 18:49 #5
Det kigger jeg lige på :-)
Avatar billede jokkejensen Novice
02. november 2012 - 19:14 #6
eller del den logisk op i mindre dokumenter som et job, det kan let klares, ex med xslt 2.0:

<xsl:for-each select="//order">
<xsl:variable name="filename"
  select="concat('Order', @orderDate, '-',@orderId,'.xml')" />
<xsl:value-of select="$filename" />
<xsl:result-document href="{$filename}" format="xml">
<xsl:copy-of select="." />
</xsl:result-document>
</xsl:for-each>

For god ordensskyld kunne du jo prøve at åbne de 40gb i en browser, som er mindst lige så hurtigt til at traversere gennem noderne som de fleste XmlParsere

/J
Avatar billede stuffedk Nybegynder
03. november 2012 - 21:16 #7
Nu er jeg ikke inde i hardware, men jeg tror det vil kræve mindst 40gb ram at gøre det du prøver på...
Avatar billede fayyaz Nybegynder
09. november 2012 - 02:04 #8
Har kigget lidt i XMLreader og jeg tror det er den vej jeg går, men er lidt i bare bund hvad angår at bruge funktionen, nogen der har nogle gode eks. på f.eks. at hente den nyeste eller 1 post?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester