Java I / O consome mais recursos da CPU

votos
0

Eu estou tentando criar 100 arquivos usando FileOutputStream / BufferedOutputStream. Eu posso ver a utilização da CPU é de 100% para 5 a 10 segundos. O Diretório que eu estou escrevendo está vazio. Estou criando arquivos PDF através iText. Cada arquivo tem rodada de 1 MB. Estou rodando em Linux.

Como posso reescrever o código para que eu possa minimizar a utilização da CPU?

Publicado 27/08/2009 em 03:05
fonte usuário
Em outras línguas...                            


5 respostas

votos
8

Não tente adivinhar: o perfil de seu aplicativo.

Se os números mostram que uma grande quantidade de tempo é gasto em / dentro de chamadas de escrita, em seguida olhar para maneiras de fazer mais rápido I / O. Mas se a maioria do tempo é gasto na formatação de material para a saída (por exemplo iText rendering), então isso é onde você precisa concentrar seus esforços.

Respondeu 27/08/2009 em 04:07
fonte usuário

votos
4

É este em um diretório que já contém uma grande quantidade de arquivos? Se assim for, você pode muito bem ser apenas vendo a pena para ter um monte de arquivos em um diretório - isso varia significativamente pelo sistema operacional e sistema de arquivos.

Caso contrário, o que está realmente fazendo enquanto você está criando os arquivos? Qual a origem dos dados? Eles são arquivos grandes? Uma coisa que você pode querer fazer é tentar escrever uma ByteArrayOutputStreamvez - de que maneira você pode ver o quanto da atividade é devido ao sistema de arquivos e quanto é apenas como você está obtendo / gravação dos dados.

Respondeu 27/08/2009 em 03:10
fonte usuário

votos
2

É um palpite tiro longo, mas mesmo se você estiver usando fluxos buffer certificar-se de que você não está escrevendo um único byte de cada vez.

O .read(int)e .write(int)métodos são assassinos da CPU. Você deve estar usando .read(byte[]...)e .write(byte[], int, int)com certeza.

Respondeu 27/08/2009 em 03:45
fonte usuário

votos
0

Um arquivo de 1 MB para escrever é grande o suficiente para usar um java.nioFileChannel e ver grandes melhorias de desempenho mais java.io. Reescrever seu código e medi-lo agaist o material antigo. Prevejo uma melhoria 2x, no mínimo.

Respondeu 27/08/2009 em 12:19
fonte usuário

votos
0

Você é improvável que seja capaz de reduzir a carga da CPU para a sua tarefa, especialmente em um sistema Windows. Java no Linux suporta arquivo Asynchronous I / O, no entanto, isso pode complicar seriamente seu código. Eu suspeito que você está executando no Windows, como File I / O, geralmente leva muito mais tempo no Windows do que em Linux. Eu mesmo ouvi de melhorias através da execução Java em um linux VM no Windows.

Dê uma olhada em seu Gerenciador de tarefas quando o processo está em execução, e ligue Mostrar Kernel tempos . O tempo de CPU gasto no espaço do usuário geralmente pode ser otimizado, mas o tempo de CPU no espaço do kernel normalmente só pode ser reduzir em fazer chamadas mais eficientes.

  • update -

JSR 203 trata especificamente da necessidade de assíncrona, multiplexado, dispersão / coletar arquivo IO:

A instalação multiplexado, sem bloqueio introduzido por JSR-51 resolvido muito desse problema para sockets de rede, mas não fazê-lo para as operações do sistema de arquivos.

Até JSR-203 torna-se parte de Java, você pode obter verdadeira IO assíncrono com o Apache MINA projeto no Linux.

Java NIO (1) permite que você faça com base Canal I / O. Esta é uma melhoria no desempenho, mas sua única fazendo um buffer de dados de cada vez, e não é verdade assíncrona & multiplexado IO.

Respondeu 27/08/2009 em 03:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more