2012-05-16 4 views
1

Я реализую многопоточный Wget с URL-адресами в Open Directory Project (ODP). Я получаю следующее сообщение об ошибке:Слишком много ошибок при открытии

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) 

Я читал, что это потому, что путепроводов предел дескрипторов открытых файлов, указанных в системной переменной: кот/Труды/системы/фс/файл-макс

Есть ли способ ограничить количество потоков, которые можно запустить одновременно? Я думал, что он сделал это автоматически по количеству потоков, которые могли бы запустить CPU.

Спасибо!

Edit: это основной цикл внутри основного метода:

 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(); 

ответ

0

Is there a way to limit the number of threads that can be started at the same time?

Да, с помощью какого-то пула потоков. Если вы используете Java 1.5 и выше, вам повезло; вы можете использовать ThreadPoolExecutor, чтобы ограничить количество одновременных потоков.

3

Вы, кажется, путайте между темами и файлами на весь ваш вопрос.

Большинство операционных систем ограничивают количество файловых дескрипторов, которые может открыть данный процесс. Это включает в себя фактические файлы в файловой системе и обычно включает сокеты, такие как соединения базы данных или сервера. (Это не имеет никакого отношения к количеству потоков, выполняемых в вашем процессе.)

Если вы в настоящее время используете максимальное количество открытых файлов, ваш процесс больше не сможет открываться. Обычно это признак утечки ресурсов - т. Е. Вы не закрываете свои ресурсы ввода-вывода. Очень редко, если ваше приложение законно нужно читать из десятков тысяч файлов в одно и то же время, вам нужно будет увеличить лимит ОС.

В вашем методе ODP.run вы создаете FileWriters в цикле, но не можете позвонить close()?

+0

Я поставил код того, как я обрабатываю файл-сценарист в методе ODP.run. Как видите, я закрываю его. Каждый поток открывает файловый дескриптор, поэтому количество потоков имеет какое-то отношение к числу дескрипторов файлов в определенный момент времени. – synack

+1

Я думаю, что если он порождает 10000 потоков, и каждый поток запускает вышеуказанный код, он также получит слишком много ошибок при открытии файла. – Alvin

+0

Ограничьте свои темы. Используйте threadpool. – Drona

Смежные вопросы