Jaki jest najbardziej wydajny procesor strumieniowy XSLT oparty na Javie? [zamknięte]

Mam bardzo duży plik XML, który muszę przekształcić w inny plik XML i chciałbym to zrobić za pomocą XSLT. Bardziej interesuje mnie Optymalizacja pamięci, a nie optymalizacja prędkości (choć prędkość też byłaby dobra!).

Który procesor XSLT oparty na Javie poleciłbyś do tego zadania?

Czy poleciłbyś jakiś inny sposób (non-XSLT?, non-Java?), a jeśli tak, to dlaczego?

Pliki XML w pytaniach są bardzo duże, ale niezbyt głębokie - z milionami rzędów (elementów), ale tylko około 3 poziomów głębokich.

Author: Thorbjørn Ravn Andersen, 2009-01-20

3 answers

Obecnie znane są tylko trzy procesory XSLT 2.0 i z nich Saska 9x jest prawdopodobnie najbardziej wydajny (przynajmniej według mojego doświadczenia) zarówno pod względem szybkości, jak i wykorzystania pamięci. Saxon-SA (Wersja Saxon z obsługą schematu, nie wolna jak Wersja B (basic), posiada specjalne rozszerzenia do przetwarzania strumieniowego.

Z różnych istniejących XSLT 1.0 procesory,. NET XslCompiledTransform (C # - based, not Java!) wydaje się być mistrzem.

W świecie Javy procesorów XSLT 1.0 Saska 6x znowu jest całkiem nieźle.

UPDATE :

Teraz, ponad 3 lata od daty udzielenia odpowiedzi na to pytanie, nie ma żadnych dowodów na to, że różnica wydajności między wspomnianymi procesorami XSLT uległa zmianie.

Co do streaming :

  1. dokument XML z "milionami węzłów" może być przetwarzany nawet bez przesyłania strumieniowego . Przeprowadziłem eksperyment, w którym Saxom 9.1.07 przetwarzał dokument XML, który zawiera około miliona elementów 3-poziomowych z wartościami całkowitymi. Transformacja po prostu oblicza ich sumę. Całkowity czas transformacji na moim komputerze wynosi mniej niż 1,5 sekundy. Zużyta pamięć to 500MB-coś, co komputer może mieć nawet 10 lat ago,

Oto wiadomości informacyjne Saxona, które pokazują szczegóły dotyczące transformacji:

Saxon 9.1.0.7J from Saxonica
Java version 1.6.0_17
Stylesheet compilation time: 190 milliseconds
Processing file:/C:\temp\delete\MRowst.xml
Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 1053 milliseconds
Tree size: 3075004 nodes, 1800000 characters, 0 attributes
Loading net.sf.saxon.event.MessageEmitter
Execution time: 1448 milliseconds
Memory used: 506661648
NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
  1. Saxon 9.4 ma a funkcja rozszerzenia stream() które mogą być używane do przetwarzania dużych dokumentów XML.

Oto fragment dokumentacji :

Istnieją zasadniczo dwa sposoby robienia streamingu w Saxonie:

Streaming w trybie Burst: dzięki takiemu podejściu transformacja a duży plik jest podzielony na sekwencję przekształceń małych fragmenty akt. Każdy kawałek z kolei jest odczytywany z wejścia, odwrócony do małego drzewa w pamięci, przekształconego i zapisanego na wyjście plik.

To podejście działa dobrze w przypadku plików o dość płaskiej strukturze, na przykład plik dziennika zawierający miliony rekordów dziennika, gdzie przetwarzanie każdego rekordu dziennika jest niezależne od tych, które zostały wcześniej.

A variant tej techniki wykorzystuje nowy XSLT 3.0 xsl: iterate Instrukcja iteracji nad rekordami, w miejsce xsl: for-each. Pozwala to na utrzymanie danych roboczych w postaci zapisów przetwarzane: umożliwia to np. wyprowadzenie sumy lub średnich na końcu biegu, lub aby przetwarzanie jednego rekord zależy od tego, co było przed nim w pliku. Xsl: iterate instrukcja umożliwia także wczesne wyjście z pętli, co sprawia, że możliwe do przekształcenia na przetwarzanie danych Od początku duży plik bez odczytu całego pliku.

Streaming w trybie Burst jest dostępny zarówno w XSLT, jak i XQuery, ale tam nie ma odpowiednika w XQuery do konstrukcji xsl:iterate.

Streaming templates: to podejście jest zgodne z tradycyjnym XSLT processing pattern of performing a recursive descent of the input XML hierarchii poprzez dopasowanie reguł szablonu do węzłów na każdym poziomie, ale robi to jeden element na raz, bez Budowanie drzewa w pamięci.

Każdy szablon należy do trybu (być może domyślnego, nienazwanego trybu), i streaming jest właściwością trybu, który można określić za pomocą nowa deklaracja xsl: mode. Jeżeli tryb jest zadeklarowany jako streamable, wtedy każda reguła szablonu w tym trybie musi spełniać zasady przetwarzania strumieniowego.

Zasady co jest dozwolone w przetwarzaniu strumieniowym są dość skomplikowane, ale zasadniczą zasadą jest, że szablon Reguła dla dany węzeł może odczytać Potomków tego węzła tylko raz, w spokój. Istnieją kolejne zasady narzucone ograniczeniami w obecnym Implementacja saxona: na przykład, chociaż grupowanie za pomocą jest teoretycznie spójna z implementacją strumieniową, nie jest ona obecnie implementowana w Saxon.

  1. XSLT 3.0 miałby standardową funkcję strumieniowania . Jednak dokument W3C nadal ma status "working draft" i Specyfikacja streamingu prawdopodobnie ulegnie zmianie w kolejnych wersjach draftu. Z tego powodu nie istnieją żadne implementacje aktualnej specyfikacji draft (streaming).

  2. Warning: nie każda transformacja może być wykonana w trybie streamingu-niezależnie od procesora XSLT. Jednym z przykładów transformacji, która nie jest możliwa do wykonania w trybie strumieniowym (z ograniczoną ilością pamięci RAM) dla dużych dokumentów, jest sortowanie ich elementów (np. atrybut).

 31
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-17 10:13:53

Można rozważyć STX , którego implementacją Java jest Joost . Ponieważ jest podobny do XSLT, ale jako procesor strumieniowy jest w stanie przetwarzać ogromne pliki przy użyciu bardzo małej ilości pamięci RAM.

Joost może być używany jako standardowy javax.xml.transformacja.TransformerFactory

 8
Author: Stephen Denne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-20 11:37:33

Zobacz obsługę trybu streamingu. http://www.saxonica.com/html/documentation/sourcedocs/streaming/

Jeśli ten tryb streamingu nie jest dla ciebie, możesz spróbować użyć tiny tree mode z Saxon, który jest zoptymalizowany pod kątem mniejszego wykorzystania pamięci. (I tak jest domyślne)

 3
Author: Peter Štibraný,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 11:57:43