2013-02-24 3 views
0

코드 조각이 있습니다.문자열 버퍼에 파일의 1/4을 쓰는 방법이 있습니까?

File file = new File(path); 
FileReader fr = new FileReader(file); 
BufferedReader br = new BufferedReader(fr); 
String temp; 
StringBuffer sb=new StringBuffer(); 
while((temp=br.readLine())!=null){   
    sb.append(temp); 
    sb.append(" "); 
} 

이렇게하면 파일의 모든 행을 읽고 StringBuffer에 저장합니다. 내 파일이 상당히 크고 멀티 스레딩을 요구하므로 처리 속도가 빨라집니다. 파일의 1/4 만 버퍼에 기록하도록 말하고있는 방법이 있습니까?

나는 이것을 말할 수 없다는 것을 안다. 그러나 나는 이것과 비슷한 것을 원한다.

for(int i=0; i<reader.length/4; i++) 
+0

나는 할 수 있다고 생각하지 않지만, 쿼터가 얼마나 빠른지 알면 그 시점에서 읽기를 멈출 수 있습니다. – Dukeling

+0

당신의 가공은 정확히 무엇입니까? ('StringBuffer' 이후에 데이터로 무엇을합니까?) – cheeken

+1

"상당히 거대한"이란 무엇을 의미합니까? 파일이 항상 메모리에 들어 맞을 것인가 아니면 이런 식으로 OutOfMemoryException을 피할 수 없을 정도로 커진 것일까? –

답변

0

아니 당신이 동시에 파일을 읽을 캔트 때문에, 당신은이 문제를 얻을 수 없다, 그냥 한 번에 하나의 스레드 스트림에서 읽는 경우,이 동시에 일어나지 않으며, 병렬 것입니다. 거기에는 아무런 이점이 없으며, 이와는 별도로 쓰고 읽을 수있는 코드가 훨씬 까다 롭습니다. 또한 스레드 컨텍스트 스위치와 스레드 중재가 많이 필요하지 않습니다.

당신이 할 수있는 일은 큰 파일을 작성하는 대신 작은 파일을 작성하는 것입니다. 그리고 읽기 데이터의 처리에 많은 시간이 소요될 경우 버퍼를 읽은 다음 버퍼가 메모리에서 병렬로 처리 된 후, 이게 잘 될거야.

또한 단일 스레드를 사용하는 경우 StringBuffer 대신 StringBuilder를 사용하십시오.

희망이 도움이됩니다.

+0

저는 이것을 쿼드 코어에서 실행하고 있습니다. 기판을 제조 할 때 전력 효율 요소를 제외하고는 병렬 프로그래밍이 다중 코어를 갖는 목적 중 하나라고 생각합니다. 내가 틀렸다면 나를 바로 잡아주세요. – Prasanna

1

스레드 당 1 file channel을 생성 할 수 있어야하며 파일을 통해 오프셋에서이를 사용할 수 있어야합니다. 파일 채널에서 파일의 크기를 가져 와서 분할을 처리하고 현재 위치를 설정할 수 있습니다.