2012-05-16 3 views
1

ODP (Open Directory Project)의 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) 

: 나는 다음과 같은 오류가 발생합니다 고양이/proc 디렉토리 /에서 sys /의 FS/파일 최대

동시에 시작할 수있는 스레드 수를 제한하는 방법이 있습니까? 나는 그것이 CPU를 돌릴 수있는 쓰레드의 수에 따라 자동적으로 그렇게했다고 생각했다.

감사합니다.

편집 :이는 main 메소드 내부의 메인 루프 : 방법은 내가 BufferedWritter을 만들

 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()에서는 :

 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?

예, 거기에 어떤 종류의 스레드 풀을 사용합니다. 자바 1.5 이상을 사용한다면 운이 좋을 것입니다. ThreadPoolExecutor을 사용하여 동시 스레드 수를 제한 할 수 있습니다.

3

당신은에 보인다 질문 전체에서 스레드파일 사이에 혼동을 야기 할 수 있습니다.

대부분의 운영 체제는 주어진 프로세스가 열 수있는 파일 설명자 수에 제한을두고 있습니다. 여기에는 파일 시스템의 실제 파일이 포함되며 대개 데이터베이스 또는 서버 연결과 같은 소켓도 포함됩니다. (이는 프로세스 내에서 실행되는 스레드의 수와 아무런 관련이 없습니다.)

현재 열린 파일 핸들의 수를 최대로 보유하고 있다면 프로세스를 더 이상 열 수 없습니다. 이는 일반적으로 자원 유출의 신호입니다. 즉 I/O 리소스를 제대로 닫지 못하고 있습니다. 매우 응용 프로그램이 합법적으로 수만 개의 파일을 동시에 읽어야하는 경우 OS 제한을 늘려야합니다.

ODP.run 메서드에서 FileWriters을 루프에 만들었지 만 close()을 호출하지 못했습니다?

+0

ODP.run 메소드에서 파일 작성자를 처리하는 코드를 넣었습니다. 보시다시피, 나는 그것을 닫습니다. 각 쓰레드는 파일 디스크립터를 연다. 그래서 쓰레드의 수는 특정 순간에 파일 디스크립터의 수와 관련이있다. – synack

+1

그가 10000 개의 스레드를 생성하고 각 스레드가 위의 코드를 실행하면 너무 많은 파일 열기 오류가 발생한다고 생각합니다. – Alvin

+0

스레드를 제한하십시오. 스레드 풀을 사용하십시오. – Drona

관련 문제