簡體   English   中英

如何更快地處理大量的xml文件並更快地寫入Java中的文本文件

[英]How to process large no of xml files and write into text file in java faster

我一天有數百萬個xml文件。 xml文件的大小從10KB到50 MB。

我已經編寫了SAX解析器來解析xml文件並寫入文本文件。 我正在從數百萬個xml文件中創建35個唯一的文本文件。 我必須以先到先得的基本方式來解析這些xml文件,以便保持記錄的順序。

我必須非常快速地處理文件。

xml文件的總大小約為1 TB。 我尚未實現處理XML文件的多線程,因為我必須先到先得來處理它。

如何快速處理所有xml文件?

在將代碼移入產品之前,我只想檢查是否需要重新考慮實現。

這就是我讀取xml文件並進行處理的方式。

public static void main(String[] args) {
        File folder = new File("c://temp//SDIFILES");

        File[] files = folder.listFiles();

        Arrays.sort(files, new Comparator<Object>() {
            public int compare(Object o1, Object o2) {

                if (((File) o1).lastModified() > ((File) o2).lastModified()) {
                    return -1;
                } else if (((File) o1).lastModified() < ((File) o2).lastModified()) {
                    return +1;
                } else {
                    return 0;
                }
            }

        });

        for (File file : files) {
            System.out.println("Started Processing file :" + Arrays.asList(file));
            new MySaxParser(file);
        }

    }

我不確定我的處理是否可用於數百萬個xml文件。

如您所說,您必須先到先得來處理它。 您可以將每個xml文件都視為java方法,然后可以實現多線程處理xml文件。我認為這樣可以節省很多時間。

立即:

return Long.compareTo(((File) o1).lastModified(), ((File) o2).lastModified());
  • 讀寫緩沖
  • 注意字符串操作
  • 沒有驗證
  • 對於DTD,請使用XML目錄
  • 使用探查器! (在Excel生成中保存了我)
  • 如果可能,使用數據庫而不是35個輸出文件
  • 檢查RAM磁盤等
  • 當然,內存很大-Xmx

您最后要避免的是XML解析器(StaX)或Xalan / Xerces或純文本解析。 所以對此沒有評論。

Arrays.sort(files, new Comparator<File>() {
        @Override
        public int compare(File o1, File o2) {
            return Long.compareTo(o1.lastModified(), o2.lastModified());
        }
    });

有很多事情要考慮...

  1. 當所有文件都已經存在於c://temp//SDIFILES文件夾中時,這是一個批處理過程,還是一種等待下一個文件出現在其中的事件偵聽器?

  2. 所有這些XML都有XSD模式嗎? 如果是這樣,您可能會考慮預先使用JAXB解組器而不是自定義SAX解析器

恕我直言...

  1. 如果是批處理-將結果組合到文本文件中的單獨解析過程。 然后,您可以通過使用一些臨時/階段文件/對象將多線程分析應用於文件,然后再將其放入文本文件。

    • 在資源允許的情況下運行盡可能多的解析線程(內存/ CPU)
    • 將每個解析器結果放到臨時文件/ DB /內存映射等中,其順序號或時間戳記
    • 將准備好的結果合並到文本文件中,作為整個過程的最后一步。 因此,您不會等待僅在先前的解析時解析下一個XML文件。
  2. 如果它是一個偵聽器,它也可以使用多線程進行解析,但可能僅需要一點。 例如,周期性地(例如,每10秒)將結果組合成文本文件,這將選擇標記為就緒的臨時結果文件

無論如何,這都是“部分過程”。 假設您可以為按時間戳文件列表排序的下5個文件運行5個解析線程,然后等待所有5個解析線程完成(結果可能不是臨時文件,但可以保留在內存中),然后合並進入文本文件。 ...然后選擇下5個文件,依此類推...

像那樣的東西

肯定地,順序處理需要花費大量時間,而且大部分時間都是從XML解析它們。

暫無
暫無

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

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