Pertanyaan XSLTProcessor xmlSAX2Characters: kehabisan memori


Saya memiliki halaman yang memuat file xml 500 mb dan mem-parsing file menggunakan template xsl. Parser bekerja dengan sempurna di lingkungan lokal saya. Saya menggunakan WAMP.

Di server web.

Peringatan: DOMDocument :: load () [domdocument.load]: (null) xmlSAX2Characters: kehabisan memori di /home/mydomain/public_html/xslt/largeFile.xml, baris: 2031052 di / home / mydomain / public_html / xslt / parser_large .php on line 6

Kode saya adalah seperti di bawah ini, baris 6 memuat file xml

<?php
$xslDoc = new DOMDocument();
$xslDoc->load("template.xslt"); 

$xmlDoc = new DOMDocument();
$xmlDoc->load("largeFile.xml"); 

$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
?> 

Saya telah mencoba menyalin file php.ini dari instalasi wamp ke folder tempat kode di atas berada. Tetapi ini tidak membantu. Batas memori dalam file php.ini ini adalah memory_limit = 1000M

Setiap saran / pengalaman tentang ini akan sangat dihargai


4
2018-06-25 21:03


asal


Jawaban:


Inilah kebenaran yang menyedihkan. Ada dua cara dasar bekerja dengan XML, berbasis DOM, di mana seluruh file XML hadir dalam memori sekaligus (dengan overhead yang cukup besar untuk membuatnya cepat untuk melintasi), dan SAX berbasis di mana file melewati memori, tetapi hanya sebagian kecil dari itu hadir pada waktu tertentu.

Namun, dengan DOM, konsumsi memori yang besar cukup banyak normal.

Sekarang bahasa XSLT secara umum memungkinkan konstruksi yang mengakses bagian apa pun dari keseluruhan file kapan saja dan karena itu memerlukan gaya DOM. Beberapa bahasa pemrograman memiliki pustaka yang memungkinkan memasukkan input SAX ke dalam prosesor XSLT, tetapi ini berarti pembatasan pada bahasa XSLT atau konsumsi memori tidak jauh lebih baik daripada DOM. PHP tidak memiliki jalan untuk membuat XSLT membaca input SAX.

Itu memberi kita alternatif untuk DOM; ada satu, dan disebut SimpleXML. SimpleXML adalah sedikit rumit untuk digunakan jika dokumen Anda memiliki ruang nama. Patokan kuno tampaknya menunjukkan bahwa itu agak lebih cepat, dan mungkin juga kurang boros dengan konsumsi memori, daripada DOM pada file besar.

Dan akhirnya, saya berada di sepatu Anda sekali dalam bahasa pemrograman lain. Solusinya adalah membagi dokumen menjadi dokumen kecil berdasarkan aturan sederhana. Setiap dokumen kecil berisi header yang disalin dari seluruh dokumen, satu elemen "detail" dan footer, membuat formatnya valid terhadap skema file XML besar. Ini diproses menggunakan XSLT (dengan asumsi bahwa pemrosesan satu elemen detail tidak melihat ke elemen detail lainnya) dan output digabungkan. Ini bekerja seperti pesona tetapi tidak diimplementasikan dalam hitungan detik.

Jadi, inilah pilihan Anda. Pilih satu.

  • Mengurai dan memproses XML menggunakan SAX.
  • Menggunakan SimpleXML dan berharap ini akan memungkinkan file yang sedikit lebih besar dalam memori yang sama.
  • Jalankan prosesor XSLT eksternal dan berharap akan memungkinkan file yang sedikit lebih besar dalam memori yang sama.
  • Pisahkan dan gabungkan XML menggunakan metode ini dan menerapkan XSLT hanya pada potongan kecil. Metode ini hanya praktis dengan beberapa skema.

5
2018-06-25 21:28