2016-07-07 1 views
-3

필자는 병렬로 읽고 입력 한 파일을 여러 개 읽었습니다. 그러나 모든 파일 (모든 파일)의 모든 행에 대해 약 100 개의 파일 중 하나에 액세스하여 전체를 반복하고 모든 조합을 출력 파일에 작성해야합니다.동일한 파일에서 여러 스트림을 읽는 중

그래서, 기본적으로, 나는 (내가 코드 만의 중요한 부분 추가 ​​한, 주) 이런 일이 : 두 개의 입력 파일을 읽을 수 있다는 것입니다,

int numberOfFiles = (int) new File("path/").listFiles().length; 

IntStream.range(0, numberOfFiles).parallel().forEach(k -> { 
    BufferedWriter bw = null; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader(new File("priorityQueuePreTerminal"+k+".txt"))); 
     bw = new BufferedWriter(new FileWriter(new File("priorityQueuePostTerminal"+k+".txt"), true)); 
     ... 
     try { 
      while((line = br.readLine()) != null){ 
      ... 
       BufferedReader br2 = new BufferedReader(new FileReader(new File("shared/"+i+".txt"))); 
       while((line2 = br2.readLine()) != null){ 
        bw.write(...); 
       } 
      } 
     } catch (Exception e) { } finally { br2.close(); } 
    } catch (Exception e) { } finally { br.close(); bw.close(); } 
}); 

본질적으로 어떻게됩니까을 같은 시간에 수백 개의 공유 파일 중 하나를 공유합니다. 결과적으로, 출력 파일 중 하나는 항상 완료되어야합니다. 다른 모든 출력 파일은 시작하는 몇 줄 밖에 없지만 중간에 끝납니다.

여러 스트림에서 동일한 공유 파일을 읽을 수도 있습니다 (동일한 파일을 여러 파일로 읽는 것이 좋았지 만 문제가 될 수 있음). Java 8 스트림에 synchronized에 해당하는 것이 있습니까? 하나의 스트림이 현재 하나의 파일에서만 읽히고 있는지 확인하려면?

+6

Java 8을 사용하는 경우 [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)를 사용하여 스트림을 올바르게. –

+0

이것은'java8 stream'이 아니며, 코드는 java7와 java8 사이에 있으며,'{} '을 사용하면 한 줄 이상 사용하지 않는 것이 좋습니다. – emotionlessbananas

+0

한 파일을 읽고 다른 파일에 쓰려고하십니까? – emotionlessbananas

답변

1

안녕하세요. 평행하게 파일을 읽는 것은 정말 좋은 생각입니다. 하드웨어가 하드 드라이브에 몇 가지 제약이 있기 때문입니다. 초당 700MB의 속도를 낼 수 있습니다. 어느 시점에서 팔라듐을 더 많이 읽더라도 결국 성능이 향상되지 않습니다. 디스크에 대한 IO 액세스 대신 병렬로 데이터 처리를 최적화하십시오.

진짜 대답은 아니지만. 내 충고는 모든 파일을 메모리로 읽거나 메모리에서 가능한 한 많이 읽는 것입니다. 그런 다음 할당의 처리 부분에서 멀티 스레딩을 수행하고 대신 파일 읽기 중 하나를 수행하십시오.

+0

이것을 그리드로 보내므로 하드웨어가 실제로 문제가되지 않습니다. – NoelAramis

+0

파일이 그리드에 있다는 것을 말하고 있습니까? 아니면 평행으로 읽은 후 콘텐츠를 그리드에 업로드한다는 의미입니까? –

+0

필자는 실행 파일 인 .jar과 읽을 필요가있는 필요한 모든 입력 파일과 공유 파일을 그리드로 보냈습니다. 그래서, 네, 그것들은 모두 그것 위에 있습니다. 일단 출력 파일이 생성되면 그리드에서 가져옵니다. – NoelAramis