1

Open Directory Project(ODP)のURLを使用してマルチスレッドWgetを実装しています。次のエラーが発生します。

java.io.FileNotFoundException: log (Too many open files)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:207)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at java.io.FileWriter.<init>(FileWriter.java:78)
at ODP.run(ODP.java:103)

これは、システム変数で示されている開いているファイル記述子の制限を超えているためだと読みました: cat / proc / sys / fs / file-max

同時に開始できるスレッドの数を制限する方法はありますか?CPUを実行できるスレッドの数によって自動的に実行されると思いました。

ありがとうございました!

編集:これはmainメソッド内のメインループです:

        while (rs.next ()) {                
            // Process entry
            String rsc = rs.getString ("resource");
            String tpc = rs.getString("topic");             
            (new ODP(rsc, tpc, rs.getString("description"))).start();   
            BufferedWriter outLog = new BufferedWriter(new FileWriter("log", true));
    outLog.write(count + ": " + rsc + " | " + tpc  + "\n");
    outLog.close(); 
            ++count;                
        }

ODP.run()メソッドで、BufferedWritterを作成します。

        BufferedWriter out = new BufferedWriter(new FileWriter(cat.split("/")[1] + ".webtrec", true));
        out.write(webtrec);
        out.close();
4

2 に答える 2

4

質問全体を通して、スレッドファイルの間で混乱しているようです。

ほとんどのオペレーティングシステムでは、特定のプロセスが開くことができるファイル記述子の数に制限があります。これには、ファイルシステム上の実際のファイルが含まれ、通常、データベースやサーバー接続などのソケットも含まれます。(これは、プロセス内で実行されているスレッドの数とは何の関係もありません。)

現在開いているファイルハンドルの最大数を保持している場合、プロセスはそれ以上開くことができなくなります。これは通常、リソースリークの兆候です。つまり、I/Oリソースを適切に閉じていません。 ごくまれに、アプリケーションが合法的に数万のファイルから同時に読み取る必要がある場合、OSの制限を増やす必要があります。

あなたのODP.runメソッドではFileWriters、ループで作成していますが、close()それらを呼び出すことができませんか?

于 2012-05-16T09:21:43.040 に答える
1

同時に開始できるスレッドの数を制限する方法はありますか?

はい、ある種のスレッドプールを使用することによってあります。Java 1.5以降を使用している場合は、幸運です。ThreadPoolExecutorを使用して、同時スレッドの数を制限できます。

于 2012-05-16T09:31:17.743 に答える