-1

eclipse ideを使用して、多数のファイルに対して通常の式を使用して検索および置換プログラムを作成しました。このプログラムでは、検索および置換を実行するディレクトリの名前を指定しました(サブディレクトリも含まれる場合があります)。ファイルの数はスムーズに実行されますが、1000個のファイルがあるディレクトリの場合は、何も実行されないように(jvmメモリサイズを増やした後でも)その間にハングします。BufferedReaderを使用して各ファイルを1行ずつ読み取り、正規表現を使用してその行のパターンを一致させてから、他のテキストに置き換えました。誰かが私にそれのための可能な解決策(アルゴリズム、ライブラリ、トリック、ハック)を提案できますか?

        BufferedReader br = new BufferedReader(new FileReader(fileName));
        BufferedWriter bw = new BufferedWriter(new FileWriter(changedFile));
        StringBuilder sb = new StringBuilder();
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            sb.append(line).append("\n");
        }
        br.close();
        sb.trimToSize();
        String code = sb.toString();
        code = code.replaceAll("System", "PrintWriter");
        bw.write(code);
        bw.flush();
        bw.close();
4

2 に答える 2

2

あなたが提供したコードスニペットは、実際にファイル全体をメモリにロードし、置換を実行して書き戻すという意味で、(ほとんど)正しいようです。あなたの問題に対する私の疑い:

  • あなたのプログラムは、利用可能なメモリにロードされている限界のファイルに遭遇しています。これにより、ガベージ コレクターが残業してスペースを解放し、プログラムがフリーズしたように見える可能性があります。

  • ディレクトリ再帰コードがどこかで絡まり、同じファイルを繰り返しブロックまたは反復します。

いくつかの提案:

  • CPU 使用率を確認します。プログラムは実際に何かを実行していますか? それともどこかで行き詰っていますか?ハードドライブはアクティブですか?

  • 処理する前に、プログラムに各ファイル名を出力させます。毎回特定のファイルで停止しますか? 同じ一連のファイルをループしていますか?

  • Eclipse デバッガーまたはVisualVMなどの JVM モニターを使用して、プログラムを調べます。凍っているように見えるとき、それは何をしているのですか? そのメモリ使用量と GC アクティビティはどのようなものですか?

残念ながら、あなたのプログラムに関する詳細情報がなければ、より具体的な回答を提供することは非常に困難です...

于 2013-01-02T17:53:04.660 に答える
0

お使いの OS の書き込みバッファがいっぱいになっているのではないかと思います。バグが原因でプログラムが本当にハングアップしていると判断できない限り、データがディスクにフラッシュされるのを待つ必要があります。デバッガーを使用すると、これをテストしたりjstack、スタック トレースを取得したりできます。

どこに問題があるのか​​正確に教えてください。

ハード ドライブの速度に問題があると思われます。シーク時間が 8 ミリ秒の HDD がある場合。

  • 読み取り用のファイルを見つける 8 ミリ秒
  • ファイルの読み取り 4 ~ 12 ミリ秒
  • 書き込み用のファイルを見つける 8 ミリ秒
  • ファイルの書き込み 4 ~ 12 ミリ秒
  • ファイルシステム ジャーナルの更新 8 ミリ秒。

合計所要時間は約 32 ~ 48 ミリ秒です。つまり、1 秒あたり約 20 ~ 30 個のファイルを更新できます。

50 ドル未満で、アクセス時間が 0.1 ミリ秒の 32 GB SSD を購入できます。2 倍のサイズを購入してもそれほど高くはありません。

  • 読み取り 0.1 ミリ秒のファイルを見つける
  • ファイルを読む 0.1ミリ秒
  • 書き込み用のファイルを見つける 0.1 ms
  • ファイルの書き込み 0.1 ミリ秒
  • ファイルシステムのジャーナルを 0.1 ミリ秒更新します。

合計時間は 0.5 ミリ秒で、1 秒あたり最大 2000 ファイルを処理できます。

もっとできるように見える唯一の理由は、OSが読み取りをキャッシュし、書き込みをバッファリングすることです。これらが使い果たされると (Windows ではかなり速くなるようです)、ドライブの速度によって制限されます。

于 2013-01-02T17:33:20.227 に答える