Abrir arquivo de posição particular?

0

Eu queria saber, se você tivesse um arquivo particularmente grande, dizendo que 64 MB, é possível descobrir a localização física do disco rígido e, em seguida, ler bytes de um determinado deslocamento no arquivo?

Digamos que eu esteja interessado em 100 bytes com um deslocamento de 60 MB desde o início do arquivo. Não quero as ineficiências das centenas de tentativas de disco que seriam necessárias para ir do início do arquivo até o final do arquivo se eu usasse alguma função seek () do nível de aplicativo.

Existe uma solução?

Muito obrigado!

    
por Achal Soni 14.06.2012 / 03:21

3 respostas

5

Você parece ter um equívoco sobre como o seek() se comporta. Ele localiza o local onde os dados nesse deslocamento são armazenados da forma mais eficiente possível, sem ler os bytes intermediários. Haverá algumas buscas (provavelmente não centenas), para percorrer o índice de blocos.

O que você não pode fazer é salvar o percurso do índice de blocos de uma vez quando o arquivo é aberto para o próximo. O sistema operacional teria que lembrar que o arquivo não foi modificado ou realocado desde a última vez que foi aberto, o que exigiria a memorização de muitos dados para um ganho potencial muito pequeno.

Observe que o conteúdo de um arquivo não está em posições de disco consecutivas, em geral. Os arquivos tendem a ser fragmentados. Geralmente, os sistemas de arquivos tentam reduzir a fragmentação, mas isso não pode ser garantido em geral.

    
por 14.06.2012 / 03:45
1

Relendo, parece que talvez eu não tenha respondido à pergunta básica:

Usar "seek" no nível do aplicativo (realmente, kernel) não necessariamente custa "buscas" no disco - tudo o que ele faz é atualizar o número do offset associado ao manipulador de arquivos.

Uma vez que você peça ao kernel para ler ou escrever, ele irá traduzir esse deslocamento em um deslocamento de disco, o que pode envolver blocos de leitura para descobrir isso, mas tem um melhor custo de caso de uma busca - assim como o seu acesso direto. / p>

É absolutamente possível fazer isso: é exatamente isso que o driver do sistema de arquivos faz, afinal, deve ser possível para outra pessoa. Tudo o que você precisa é acessar o disco bruto.

são exemplos de pessoas fazendo isso para formatos de sistema de arquivos existentes. Você também pode fazer isso manualmente, se quiser.

Se o sistema de arquivos estiver em uso ativo, você tem alguns desafios técnicos que dificultam o trabalho - porque o conteúdo do disco está mudando de uma maneira que você não consegue enxergar -, mas ainda é possível.

Você também pode perguntar diretamente ao kernel; a ferramenta xfs_bmap faz isso, e pelo menos alguns sistemas de arquivos implementam a mesma interface para que você possa perguntar diretamente.

O cálculo do local levará o mesmo número de pesquisas que o kernel executará, portanto, é improvável que você realmente salve qualquer coisa fazendo isso.

    
por 14.06.2012 / 03:26
0

Eu não penso assim.

Se você abrir o arquivo, estará no início (para leitura / gravação) ou no final (para anexar). Mesmo em "modo de atualização" você não vai simplesmente pousar em algum local especificado no meio do arquivo.

Acho que o melhor que você pode fazer é o que você já evitou: se você puder calcular o deslocamento desde o início, você poderia procurar diretamente esse local e ler os dados. Eu não acho que isso envolveria operações de leitura excessivas no meio. Você deve ler depois de abrir o arquivo deve estar no deslocamento calculado.

    
por 14.06.2012 / 03:24

Tags