2009-08-27 4 views
0

FileOutputStream/BufferedOutputStream을 사용하여 100 개의 파일을 만들려고합니다. CPU 사용률이 5 ~ 10 초 동안 100 %임을 알 수 있습니다. 내가 쓰고있는 디렉토리는 비어 있습니다. 나는 iText를 통해 PDF 파일을 만들고 있습니다. 각 파일은 1MB의 둥근 있습니다. Linux에서 실행 중입니다.Java I/O가 더 많은 CPU 리소스를 사용합니다.

어떻게 CPU 사용률을 최소화 할 수 있도록 코드를 다시 작성할 수 있습니까?

+0

나는 그것이 OS 자체의 디자인에 있다고 생각한다. 우분투에서는 그렇게 할 수 없으며 Windows에서는 NTFS의 설계와 파일 액세스 메커니즘의 창 때문에 일반적인 상황입니다. Windows XP는 하나의 사용자 OS로 만들어졌으며 사용자가 'XXX 파일을 한 번에 열면 어떻게 될 것인가?'에 많은 관심을 기울이지 않았습니다. 나는 Windows 7에서 상황이 개선되었다고 생각한다. –

답변

4

이미 많은 파일이있는 디렉토리에 있습니까? 그렇다면 디렉토리에 많은 파일이있는 것에 대한 처벌을 볼 수 있습니다. 이는 운영 체제와 파일 시스템에 따라 크게 다릅니다.

그렇지 않으면 파일을 만드는 중에 실제로 무엇을하고 있습니까? 데이터의 출처는 어디입니까? 큰 파일입니까? 한 가지 할 일은 ByteArrayOutputStream에 쓰기를 시도하는 것입니다. 그러면 파일 시스템으로 인한 활동의 ​​양과 데이터를 얻거나 쓰는 방법을 알 수 있습니다.

+0

내가 쓰고있는 디렉토리가 비어있다. 나는 iText를 통해 PDF 파일을 만들고 있습니다. 각 파일은 1MB의 둥근 있습니다. Linux에서 실행 중입니다. 그리고 ByteArrayOutputStream을 사용하여 많은 차이를 발견했습니다. – Niger

0

특히 Windows 시스템에서 작업에 대한 CPU로드를 줄일 수는 없습니다. Linux의 Java는 비동기 파일 I/O를 지원하지만 코드가 심각하게 복잡해질 수 있습니다. File I/O는 일반적으로 Linux에서보다 Windows에서 훨씬 더 많은 시간이 걸리므로 Windows에서 실행되고있는 것으로 판단됩니다. Windows의 Linux VM에서 Java를 실행하여 개선 사항에 대해서도 들어 봤습니다.

프로세스가 실행 중일 때 작업 관리자를 살펴보고 커널 시간 표시을 설정하십시오. 사용자 공간에서 소비되는 CPU 시간은 일반적으로 최적화 될 수 있지만, 커널 공간의 CPU 시간은 일반적으로보다 효율적인 호출을 통해서만 줄일 수 있습니다.

  • 업데이트 - 특별히 수집/파일 IO 비동기, 멀티 플렉스, 분산에 대한 요구를 해결

JSR 203 : JSR-51에 의해 소개 된 다중화 된 비 블록 설비가 많이 해결

그 문제의 네트워크 소켓에 대해,하지만 그것은 파일 시스템 작업을 위해 그렇게하지 않았습니다. JSR-203은 자바의 일부가 될 때까지

, 리눅스에 Apache MINA 프로젝트와 비동기 IO 진정한 얻을 수 있습니다.

Java NIO (1)을 사용하면 채널 기반 I/O를 수행 할 수 있습니다. 이는 성능이 향상되었지만 한 번에 데이터 버퍼를 수행하는 것이고 실제로는 비동기식이 아닙니다 & 다중화 IO입니다.

+0

Stu, http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileChannel.html 스펙에서 뭔가를 볼 수있는 곳을 알려주십시오. 비동기 IO에 대해. 나는 Java가 Windows에서 DMA를 할 수 없다고 말하지 않았다. 그것은 완전히 다른 것입니다. – brianegge

2

버퍼링 된 스트림을 사용하는 경우에도 한 번에 한 바이트 씩 쓰지 않는 것이 좋습니다.

.read(int).write(int)은 CPU 킬러입니다. 확실하게하려면 .read(byte[]...).write(byte[], int, int)을 사용해야합니다.

8

추측하지 마십시오. 응용 프로그램을 프로파일하십시오.

숫자가 쓰기 호출에서 /에서 많은 시간이 소요되었다는 것을 나타내는 경우 빠른 I/O를 수행하는 방법을 살펴보십시오. 그러나 출력 (예 : iText 렌더링)을 위해 서식을 지정하는 데 대부분의 시간을 소비하는 경우, 여기에 노력을 집중해야합니다.

+2

+1 - 문제가 무엇인지 추측하기 전에 프로필을 작성하십시오. –

0

쓸 1MB 파일은 java.nio FileChannel을 사용하고 java.io 이상의 큰 성능 향상을 제공 할만큼 충분히 큽니다. 코드를 다시 작성하고 이전 내용을 변경하십시오. 나는 최소한 2 배의 향상을 예측합니다.

관련 문제