Por que as leituras de disco seriam mais pesadas do que as gravadas com um aplicativo java simples que cria muitos arquivos pequenos?

2

Eu tenho um aplicativo java 7 muito simples que lê de um formato de arquivo proprietário (Hadoop sequencefile) localizado no disco xvdb e cria milhões de arquivos de 2-20kb no disco xvdf .

  ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, ((BytesWritable)value).getLength());
  File imageFile = new File(filePath);
  FileOutputStream fos = new FileOutputStream( imageFile );
  fos.getChannel().write(byteBuffer);
  fos.close();

A execução de iostat -d 30 mostra que estamos fazendo mais do que uma leitura dupla no disco do que escrevendo. Não há nenhuma outra atividade neste volume que o aplicativo acima, que é apenas gravando neste disco.

  Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
  xvdap1            0.40         0.00         3.07          0         92
  xvdb             19.90       828.67         0.00      24860          0
  xvdap3            0.00         0.00         0.00          0          0
  xvdf            988.93      3538.93      1385.47     106168      41564

opções de montagem:

  /dev/xvdf on /mnt/ebs1 type ext4 (rw,noatime,nodiratime)
    
por davidparks21 16.03.2013 / 05:06

1 resposta

3

A criação de um arquivo requer primeiro determinar se esse arquivo já existe ou não. Como esses arquivos são muito pequenos, a leitura de metadados para determinar como e onde criar o arquivo excede a minúscula gravação feita depois que o arquivo foi criado.

Se você estiver familiarizado com estruturas de dados, adicione um pequeno nó de folha a uma árvore binária, árvore B ou estrutura semelhante. Você vai fazer muita leitura para descobrir onde o nó da folha vai, se já está na árvore e assim por diante. Isso será muito maior do que a pequena quantidade de dados no nó da folha.

    
por 16.03.2013 / 05:24