簡體   English   中英

使用Java處理大型文件-XML或序列化文件哪個更好?

[英]Which is better for processing a huge file in Java - XML or Serialized file?

我有一個巨大的文件(超過3GB)作為XML。 當前,我在Java代碼中讀取XML,對其進行解析並存儲在HashMap中,然后將HashMap用作查找。 對於此代碼的每次運行,此過程在1000個不同的JVM中進行了大約1000次。 1000個不同的JVM在輸入數據的1000個分區上運行,因此此過程必須進行1000次。

我想知道是否是一次活動,如果我序列化HashMap然后存儲輸出。 然后在Java程序中只需反序列化HashMap,避免將XML文件解析1000次。

這會大大加快代碼的速度嗎? 還是序列化開銷會抵消任何收益?

編輯:1. 1000個不同的JVM對輸入數據的1000個分區進行操作,因此此過程必須進行1000次。

您可以考慮使用Chronicle Map 它可以在堆外內存中加載一次,並在多個JVM之間共享,而無需反序列化。 也就是說,它使用很少的堆,您只需要讀取map.get(key)的條目

它通過內存映射文件來工作,因此,一旦第一個程序將其帶入內存,即使沒有程序使用它,您也不必付出多次加載的代價。

免責聲明:我幫忙寫了。

為什么要加載和解析同一張地圖1000次? 如果沒有其他問題,您可以只復制第一個加載的副本,以避免從磁盤讀取另外3GB以上的內存。

序列化的文件可能會更快,但是並不能保證。 唯一可以確定的方法是,您可以在計算機上試用它並對其進行基准測試以衡量差異。 只是要了解獲得良好基准測試結果所需的所有問題(如JIT預熱)。

獲得良好性能的最佳方法是讀取一次文件並將其保存在內存中。 這樣做會產生開銷,但是如果您經常調用它,那將是值得的。 您還應該考慮將數據庫用於類似這樣的事情,您始終可以使用在本地運行的輕量級數據庫。

從我的經驗來看,用於序列化XML的最佳格式是XML。 XML表示形式通常小於Java序列化的輸出,因此加載速度更快。 但是嘗試一下看看。

我不清楚的是,為什么除非您的處理高度分散(例如,在沒有共享內存的群集上),否則根本需要序列化分區。

使用Saxon-EE,您可以執行以下處理:

<xsl:template name="main">
  <xsl:stream href="big-input.xml">
    <xsl:for-each select="/*/partition" saxon:threads="50">
      <xsl:sequence select="f:process-one-partition(copy-of(.))"/>
    </xsl:for-each>
  </xsl:stream>
</xsl:template>

函數f:process-one-partition可以用Java或XSLT編寫。

為此所需的內存數量約為線程數*一個分區的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM