2017-04-10 11 views
1

大きなテキストファイルがあります。このファイルのテキストを追加するなどの操作をせずに試してみると、読み込みが必要です私はarrayListにいくつかのテキストを追加しようとすると、次にそれはあまりにもゆっくりですいくつかの操作をしたい、あなたはこのデータを読んでそれを使用することができます知っていますか? これは私のコードです:大きなテキストファイルを読み込んでJavaで動作させる方法

public class ReaderTEst { 
public static void main(String[] args) throws IOException { 
    List<String> graphList = new ArrayList<>(); 
    List<String> edgeList = new ArrayList<>(); 
    FileInputStream inputStream = null; 
    Scanner sc = null; 
    try { 
     inputStream = new FileInputStream("myText.txt"); 
     sc = new Scanner(inputStream, "UTF-8"); 
     while (sc.hasNextLine()) { 
      String line = sc.nextLine(); 
      line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character 
      if (Character.isWhitespace(line.charAt(0))) { 
       edgeList.add(line.trim()); 
      } else { 
       graphList.add(line); 
      } 
     } 
     if (sc.ioException() != null) { 
      throw sc.ioException(); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (sc != null) { 
      sc.close(); 
     } 
    } 
} 

} それは多くの時間を要し、あなたはそれがより速くなる可能性がどのように知っているのですか?私が変更した場合、私は600メガバイト でファイルのTXTを持っている:

List<Integer> graphList = new ArrayList<>(1); 
int i = 0; 
while (sc.hasNextLine()) {`String line = sc.nextLine();` 
     line = line.replace("\uFEFF", "");//i use UTF-8 file so I need delete unneeded character 

      graphList.add(i++); 

    } 

私は動作しますが、私は入れた文字列をしたいとき、それは

答えて

0

あなたの主な課題は以下の通りですあまりにも長い時間を要する:

List<String> graphList = new ArrayList<>(); 
List<String> edgeList = new ArrayList<>(); 

Listを初期容量で初期化して、JVMがバッキングアレイを自動的に拡張する必要がないようにする必要があります。

line = line.replace("\uFEFF", ""); 

これにより、プログラムの速度も低下します。各行にどれくらいの頻度で\uFEFFがありますか?私はそれが交換しようとする前に、行に\uFEFFが含まれているかどうかを確認します。

それ以外は、最適化することはあまりありません。おそらくFileChannelを使ってファイルを読むことができますが、それはそれです。

1

BufferedReader.readLine()を使用してください。 1秒間に何百万本もの行を読むことができます。 Scannerは、あなたがやっていることには過剰です。

BUT \uFEFFはテキストではありません。このは本当にのテキストファイルですか?それはBOMマーカーですか?この場合、最初の行の先頭にのみ表示されます。行ごとにスキャンする必要はありません。

+0

をお勧めそれは私がUTF-8を使用し、最初の文字に、私は奇妙な空の文字を持っているので、私は唯一のcharAt(0)でそれを使用しようとする正弦ある – grapexs

+0

ので、それは* BOMマーカーなので、最初の行から削除する必要があります。 – EJP

0

まず最初に、私は、リストのLinkedList実現を、アーキテクチャ上の特徴のために使用することをお勧めします。したがって、ArrayListは組み込み配列であり、LinkedListはノードで構成されています。 ArrayListは新しい大きな配列を作成し、古い配列をコピーして新しい配列をコピーします。 Oracleはこのことについて完璧な文書を持っている、私はあなたにLinkedList ArrayList

関連する問題