2

私のプログラムは、さまざまなサイズのテキスト ファイルを読み取ります。次に、テキスト ファイルから数値を取得し、その数値に基づいて配列リストを作成します。使用する予定の最大ファイルは 286,040 KB です。プログラムを実行してファイルを読み取ると、プログラムが動作しなくなります。

Java プログラムが処理できる最大サイズを知るにはどうすればよいですか? Java プログラムが処理できるファイルのサイズを計算する方法はありますか?

また、私のプログラムがこのような大きなサイズの配列リストを保持できるようにするための最良の提案は何ですか? ただし、ハッシュ テーブルについては聞いたことがあります。私はその概念を完全に理解することができませんでした。

リクエストごとに、ファイルのアップロード方法を追加しています。

String name = getFileName();
Scanner scanDaily = new Scanner(new File(name));

public static String getFileName()
{ //getFileName
    Scanner getName = new Scanner (System.in);
    System.out.println("Please input File Name");
    String fileName = getName.nextLine();
    return fileName;    
}  //getFileName

更新:回答してくれた人に感謝します、とても役に立ちました

新しい問題

ファイルから配列リストに数値を読み込みたい

          String name = getFileName();
    FileReader f= new FileReader(new File(name));
        BufferedReader bf=new BufferedReader(f);
        Scanner sc=new Scanner(bf);

    ArrayList<Double> ID = new ArrayList<Double>();
    ArrayList<Double> Contract = new ArrayList<Double>();
    ArrayList<Double> Date = new ArrayList<Double>();
    ArrayList<Double> Open = new ArrayList<Double>();
    ArrayList<Double> High = new ArrayList<Double>();
    ArrayList<Double> Low = new ArrayList<Double>();
    ArrayList<Double> Close = new ArrayList<Double>();
    ArrayList<Double> Volume = new ArrayList<Double>();

    int rows = 8;
    int counter1 = 0;

    //Update code to prompt user for file
    ArrayList<Double> list = new ArrayList<Double>();

    while (scanDaily.hasNext())
    { //while
        double value = scanDaily.nextDouble();
        DecimalFormat df = new DecimalFormat("#.#####");
        df.format(value);
        list.add(value);
    }  //while

スキャナーを使用してファイルを読み取る前、そのスキャナーの名前は scandaily でした。filereader と buffered reader があるので、どちらを使用して txt ファイルを調べますか?

4

6 に答える 6

6

ファイル全体をメモリに保存する必要がありますか?

単純な処理についてはBufferedReader、特に の使用を検討する必要があります。BufferedReader.readLine

ファイルの各行に対してアクションを実行できるため、ファイル全体をロードする必要がなくなります。

于 2013-06-11T12:32:51.207 に答える
2

次のような方法で、JVM の最大メモリ サイズを増やすことができます。

$ java -Xmx1024m ....

ただし、このデータの読み取りと保存の方法をより効率的にしたい場合があります。たとえば、完全なファイルをメモリに読み込んでから、int のリストに解析/変換していますか? もしそうなら、ファイル全体をメモリに保持せずに、各行を単純に読み取って解析してみませんか。

たとえば、詳細については、この回答を参照してください。

于 2013-06-11T12:27:06.923 に答える
1

プログラムを実行してファイルを読み取ると、プログラムが動作しなくなります。

問題はこれだと思い、コードを追加した後に確認しました。私は以前に同様の問題に直面したことがあります。

問題の原因となっているオブジェクトにScanner直接使用します。Fileそれはバッファリングされていないためです。BufferedReader代わりに使用してください。大きなファイル オブジェクトでスキャナを直接使用すると、失敗することが判明しました。なぜなら、それはバッファリングされていないと思います。

Scanner scanDaily = new Scanner(new File(name));  //problematic for big files.

その代わりに使用BufferedReaderして使用します。FileReader必要に応じてファイルからデータをバッファリングしますが、一度にはバッファリングしません。

例:

     import java.io.BufferedReader;
     import java.io.FileReader;
     import java.util.Scanner;
     import java.io.File;
     ...............
     FileReader f=new FileReader(new File(fileName));
     BufferedReader bf=new BufferedReader(f);
     Scanner sc=new Scanner(bf);

したがって、コードは次のようになります。

     String name = getFileName();
     FileReader f= new FileReader(new File(name));
     BufferedReader bf=new BufferedReader(f);
     Scanner sc=new Scanner(bf);

プログラムがスキャナー コードでハングします。これは、大きなファイルを一度にメモリにロードしているため、時間がかかるためです。

また、私のプログラムがこのような大きなサイズの配列リストを保持できるようにするための最良の提案は何ですか? ただし、ハッシュ テーブルについては聞いたことがあります。私はその概念を完全に理解することができませんでした。

この場合、ファイルサイズが大きいためです。メモリマップファイルを使用することをお勧めします。そのため、ファイルをメモリにマップし、それを使用して配列のようにアクセスできます。Java でのメモリ マッピングに関するこのリンクを参照してください。

についてはすでにご存知のようですArrayLists

簡単に説明しますHashMapHashMapキーと値のペアを使用してデータを保存します。値が保存されるキーに基づいています。キーを使用してデータを保存し、データを取得します。

例:

          HashMap<KeyType,ValueType> hm=new HashMap<KeyType,ValueType>

したがって、このようにして、任意の型をキーとして、任意の型を値として使用できます。

          HashMap<Integer,String> hm = new HashMap<Integer,String>
          hm.set(0,"hello");
          hm.set(5,"bello");

          HashMap<String,String> sm=new HashMap<String,String>
          sm.set("USA","United States of America");
          sm.set("UK","United Kingdom");
          sm.set("IND","India");
          sm.set("AUS","Australia");              

          so, you can query `sm.get("AUS")` to get `"Australia"`,

どのデータ構造を使用するかを決定するには: LinkedList または ArrayList に対して HashMap を使用する場合、およびその逆を使用する場合

これで問題が解決することを願っています。

于 2013-06-11T13:01:10.977 に答える
0

JVM のメモリ割り当てを増やしてみてください。 この投稿を確認してください。また、結論に至る前にプログラムがハングした場合に発生する正確な例外/エラーを追跡してみてください。

于 2013-06-11T12:31:20.053 に答える