Tôi thường xuyên gặp sự cố về hiệu suất khi XSL chuyển đổi một lượng lớn dữ liệu thành HTML. Những thông tin này thường chỉ là một vài bảng rất lớn xấp xỉ hình thức này:Làm thế nào để tránh O (n^2) phức tạp khi nhóm các bản ghi trong XSLT?
<table>
<record>
<group>1</group>
<data>abc</abc>
</record>
<record>
<group>1</group>
<data>def</abc>
</record>
<record>
<group>2</group>
<data>ghi</abc>
</record>
</table>
Trong chuyển đổi, tôi muốn trực quan nhóm các hồ sơ như
+--------------+
| Group 1 |
+--------------+
| abc |
| def |
+--------------+
| Group 2 |
+--------------+
| ghi |
+--------------+
Một thực hiện ngớ ngẩn này được cái này (bộ là từ http://exslt.org việc thực hiện thực tế là một chút khác nhau, đây chỉ là một ví dụ):.
<xsl:for-each select="set:distinct(/table/record/group)">
<xsl:variable name="group" select="."/>
<!-- This access needs to be made faster : -->
<xsl:for-each select="/table/record[group = $group]">
<!-- Do the table stuff -->
</xsl:for-each>
</xsl:for-each>
Thật dễ dàng để thấy rằng điều này có xu hướng có O(n^2)
phức tạp. Thậm chí tệ hơn, vì có rất nhiều trường trong mỗi bản ghi. Các dữ liệu hoạt động trên có thể đạt đến vài chục MB, số lượng hồ sơ có thể lên đến 5000. Trong trường hợp xấu nhất, mỗi bản ghi có nhóm riêng và 50 trường. Và để làm cho mọi việc còn tồi tệ hơn nhiều, có là có một mức độ nhóm tốt, làm cho này O(n^3)
Bây giờ sẽ có khá một vài lựa chọn:
- tôi có thể tìm ra một giải pháp Java để bản đồ liên quan đến điều này và cấu trúc dữ liệu lồng nhau. Nhưng tôi muốn cải thiện kỹ năng XSLT của mình, vì vậy đó thực sự là tùy chọn cuối cùng.
- Tôi có thể không biết gì về một tính năng thoải mái tại Xerces/Xalan/Exslt, có thể xử lý nhóm tốt hơn nhiều
- tôi có lẽ có thể xây dựng một chỉ số của một số loại cho
/table/record/group
- Bạn có thể chứng minh với tôi rằng
<xsl:apply-templates/>
cách tiếp cận nhanh hơn rất nhiều trong trường hợp sử dụng này so với cách tiếp cận<xsl:for-each/>
.
Bạn nghĩ mức độ phức tạp này có thể giảm như thế nào?
Cảm ơn bạn đã giải thích. Đừng lo lắng về sự hình thành tốt, đó chỉ là một ví dụ để giữ cho nó đơn giản. Trong trường hợp này, giải pháp của @ IvanDugic có lẽ nhanh hơn một chút, bởi vì thực sự, các nhóm đã được sắp xếp trong một cơ sở dữ liệu. Vì vậy, tiêu đề nhóm có thể được tạo bằng cách sử dụng ' ' Nhưng đây rõ ràng là điều cần ghi nhớ –
@LukasEder: Tại sao bạn không thử cả hai giải pháp và thực hiện các phép đo? –
Tôi sắp sửa làm điều đó. Tôi sẽ cho bạn biết –