我正在研究在XSL中使用流式傳輸的用例。我知道兩種明確的情況:在早期退出之外的小文檔上進行XSL流處理的用例?
答:您需要轉換一個非常大的文檔,其整個內容不能保存在內存中。 B.您只需要文檔的一小部分,並且通常「小部分」靠近頂部。然後,您可以通過提前退出節省時間。
我寫信問,如果在實踐中,存在第三實際使用案例:
C.你有一個簡單的轉換,想放棄構建XML樹所需的CPU時間。 舉個例子,假設一個商店的出貨量都存儲在以下格式的XML結構:
頂級=年
2級=月
3級=日裝運
的在裝運4級=貨物ID
5級=個別項目
菊爲了舉例,考慮一種轉換,其目的是在「月」級別提取信息......只需要存儲在月份元素的屬性中的數據,並且不需要關於這些節點的後代的任何信息。
即使必須閱讀整個文檔,這種轉換是否有可能從流式傳輸中受益?我希望有一段時間可以獲得,因爲不需要建造樹木,但是在我有限的測試中,似乎並非如此。
我在SAXON 9.5.1.3中試過這樣一個例子,流式傳輸比非流式傳輸例子慢了20%左右。 也許執行流式處理所涉及的開銷幾乎總是會比沒有構建樹的時候更糟? (至少在SAXON,樹木建設速度非常快)
或者我在測試中犯了一個錯誤,並且有清晰的例子說明流式更有效率,即使整個文檔都要被讀取?
我可能會繼續偶爾嘗試一下,我會告訴你,如果我最終發現一個真實的案例,我的真實生活中的一個分析最終會因爲放棄樹木而受益。實際上,我的工作通常只有很少的序列化成本,因爲我使用XSL分析數據而不是轉換數據。 [我寧願使用本地XPath3的語言,而不是將所有內容都轉換爲PyTables ...] –
另一種降低內存需求的情況當然是當您擁有大量小文檔而不是單個大文檔時。這可能是使用collection()的批處理過程,也可能是進行大量轉換的高吞吐量Web服務。 –