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.
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 :
- 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
- 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.
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).
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).
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
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)
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