簡體   English   中英

如何有效地讀取Java中的巨大文本文件並拆分其內容以對其進行排序?

[英]How to read efficiently a huge text file in java and split its content to sort it?

我具有以下文本文件結構(大約360741 KB):

123123123123,123123123,1,123123,123123,NAME1,LASTNAME1,LASTNAME2

由於我需要按名稱對文件進行排序,因此我試圖將其放置在LinkedList中,以使我可以更輕松地通過Merge-Sort或Quicksort等算法對文件進行排序。

我的問題是拆分每一行並將其放置在LinkedList中花費的時間太長。

你們可以建議我以更省時的方式執行此操作嗎?

我在做什么:

   try {
        BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\MyDirectory\\File.txt"));
        String str;
        LinkedList<Persona> li = new LinkedList();
        while ((str = in.readLine()) != null) {
            //System.out.println(str);
            String[] array = str.split(",");

             //Take the values from the array to create an instance of the class and place it in the LinkedList.
            li.add(new Persona(array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]));
            //System.out.println(str);
        }
        System.out.println("fin");
        in.close();
    } catch (IOException e) {
        System.out.println("File Read Error");
    }

}

LinkedList在內存方面不是特別有效,並且對於內置排序算法不適用。 我建議您將每一行加載到一個數組列表中,並僅按名稱進行拆分(不要對每個字段進行拆分,因為您不需要將其拆分)

您可以使用Collections.sort和自定義比較器對ArrayList進行排序。

注意:您可以期望352 MB的文本至少使用1 GB的內存,我建議給它2-4 GB以提高性能。

這將采取5個不同的步驟:

1)將文件分成幾個部分(當然,您可能知道這一點,也許是10 MB的塊)。 通過您看似很小的內存容量可以管理的事情。

2)分別對每個塊排序。 保存到自己的文件中(這是為了易於管理)

3)將每個排序列表通過AZ字母合並為單獨的文件作為文件名(或者,但是您要根據A與Z的比較數,即A1.txt A2.txt A3.txt ...等)

4)將合並的文件按組分類在單獨的大文件中。 (所有的A,然后是B,等等)

5)將文件合並為一個大文件(如果需要)

注意:這也稱為“ External Sort 而且您不應該使用鏈表。 嘗試使用向量或某些已構建的排序功能。

暫無
暫無

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

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