2013-03-12 25 views
7

Potrzebuję parsować pliki XML o rozmiarze 40 GB, a następnie normalizować i wstawiać do bazy danych MySQL. Ile pliku, który muszę przechowywać w bazie danych, nie jest jasne, ani nie znam struktury XML.Parsowanie bardzo dużych plików XML w php

Którego parsera należy użyć i jak by to zrobić?

+1

W przypadku dużych plików, należy zawsze używać parser ciągnącego jak XMLReader; po prostu spróbuj załadować 40 GB pliku do pamięci dla SimpleXML. –

+1

z powiązanych wpisów: http://stackoverflow.com/questions/911663/parsing-huge-xml-files-in-php?rq=1 – hexblot

+0

40 Gb? Wow, miałem problem z plikiem 700 Mb xml na komputerze Mac OS X. –

Odpowiedz

11

W PHP można przeczytać w ekstremalnych dużych plików XML z XMLReaderDocs:

$reader = new XMLReader(); 
$reader->open($xmlfile); 

ekstremalne duże pliki XML powinien być przechowywany w skompresowanym formacie na dysku. Przynajmniej to ma sens, ponieważ pliki XML mają wysoki współczynnik kompresji. Na przykład gzipowany jak large.xml.gz.

PHP obsługuje że całkiem dobrze z XMLReader za pośrednictwem compression wrappersDocs:

$xmlfile = 'compress.zlib://path/to/large.xml.gz'; 

$reader = new XMLReader(); 
$reader->open($xmlfile); 

XMLReader pozwala pracować na bieżącym elemencie „tylko”. Oznacza to, że jest to tylko do przodu. Jeśli chcesz zachować stan analizatora składni, musisz go skompilować.

Często pomocne jest zawijanie podstawowych ruchów w zestaw iteratorów, które wiedzą, jak operować na XMLReader, takich jak powtarzanie elementów lub elementów potomnych. Znajdziesz to w postaci podanej w Parse XML with PHP and XMLReader.

Zobacz także:

2

Byłoby miło wiedzieć, co faktycznie zamierzasz zrobić z XML. Sposób, w jaki go analizujesz, zależy w dużym stopniu od przetwarzania, które musisz wykonać, a także od rozmiaru.

Jeśli jest to jednorazowe zadanie, zacząłem w przeszłości od odkrycia struktury XML, zanim zrobię cokolwiek innego. Mój DTDGenerator (patrz saxon.sf.net) został napisany w tym celu dawno temu i nadal spełnia swoją rolę, są teraz dostępne inne narzędzia, ale nie wiem, czy przetwarzają strumieniowo, co jest warunkiem wstępnym.

Możesz napisać aplikację, która przetwarza dane przy użyciu parsera strumieniowego typu "przeciągnij lub naciśnij" (SAX lub StAX). To, jak łatwo jest to robić, zależy od tego, ile przetwarzania masz do wykonania i ile stanu musisz utrzymywać, czego nam nie powiedziałeś. Alternatywnie możesz spróbować streamowanego przetwarzania XSLT, które jest dostępne w Saxon-EE.