3

たとえば、サーバーは5秒ごとに、ファイルが特定のディレクトリに追加されているかどうかを確認します。はいの場合、それらを読み取って処理します。関連するファイルは非常に大きくなる可能性があるため(たとえば、100以上のMo)、それらを上記のディレクトリにコピー/アップロードするのに非常に時間がかかる可能性があります。

サーバーがコピー/アップロードが完了していないファイルにアクセスしようとするとどうなりますか?JAVAはこれらの同時アクセスをどのように管理しますか?サーバーのOSに依存しますか?


〜1300000行のTXTファイル(つまり、約200 Mo)をリモートサーバーからローカルコンピューターにコピーしてみました。これには約5秒かかります。この経過中に、次のJAVAクラスを実行します。

public static void main(String[] args) throws Exception {

    String local = "C:\\large.txt";

    BufferedReader reader = new BufferedReader(new FileReader(local));
    int lines = 0;
    while (reader.readLine() != null)
        lines++;
    reader.close();

    System.out.println(lines + " lines");

}

次の例外が発生します。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
    at java.lang.StringBuffer.append(StringBuffer.java:306)
    at java.io.BufferedReader.readLine(BufferedReader.java:345)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at main.Main.main(Main.java:15)

ファイルのコピーが完了した後でクラスを実行すると、期待どおりの出力(つまり1229761 lines)が得られるため、例外はファイルのサイズによるものではありません(最初に考えることができます)。OutOfMemoryErrorこの例外をスローしたバックグラウンドでJAVAは何をしていますか?

4

2 に答える 2

1

行数を数えるためだけにバッファリーダーを使用しているのはなぜですか?

javadocから:文字入力ストリームからテキストを読み取り、文字、配列、および行を効率的に読み取ることができるように文字をバッファリングします。

これは、「バッファリング」することを意味します。スタックダンプの原因となるファイル全体をメモリに保存します。FileReaderを試してください。

于 2013-03-04T20:08:15.940 に答える
1

JAVAはこれらの同時アクセスをどのように管理しますか?サーバーのOSに依存しますか?

特定のOSによって異なります。単一のJVMAsynchronousFileChannel(1.7の新機能)クラスでコピーとサーバーを実行する場合は、非常に役立ちます。ただし、クライアントとサーバーが異なるJVMで表されている場合(またはそれ以上が異なるマシンで起動されている場合)、すべてがプラットフォーム固有になります。

AsynchronousFileChannelのJavaDocから:

FileChannelと同様に、このクラスのインスタンスによって提供されるファイルのビューは、同じプログラム内の他のインスタンスによって提供される同じファイルの他のビューと一致することが保証されています。ただし、このクラスのインスタンスによって提供されるビューは、基盤となるオペレーティングシステムによって実行されるキャッシュと、ネットワークファイルシステムプロトコルによって引き起こされる遅延のために、同時に実行されている他のプログラムによって表示されるビューと一致する場合と一致しない場合があります。これは、これらの他のプログラムが記述されている言語に関係なく、またそれらが同じマシンで実行されているか、他のマシンで実行されているかに関係なく当てはまります。このような不整合の正確な性質はシステムに依存するため、特定されていません。

于 2013-03-05T07:46:58.663 に答える