
Eu queria saber, se você tivesse um arquivo particularmente grande, com 64 MB, é possível descobrir a localização do arquivo no disco rígido físico e, em seguida, ler bytes de um deslocamento específico no arquivo?
Digamos que estou 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 buscas de disco que seriam necessárias para ir do início ao final do arquivo se eu usasse alguma função search() no nível do aplicativo.
Há uma solução?
Muito obrigado!
Responder1
Você parece ter uma ideia errada sobre como seek()
se comporta. Ele localiza o local onde os dados nesse deslocamento são armazenados da maneira mais eficiente possível, sem ler os bytes intermediários. Haverá algumas buscas (provavelmente não centenas) para percorrer o índice do bloco.
O que você não pode fazer é salvar o percurso do índice do bloco de um momento em que 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 consecutivas do disco, em geral. Os arquivos tendem a ser fragmentados. Os sistemas de arquivos geralmente tentam reduzir a fragmentação, mas isso não pode ser garantido em geral.
Responder2
Relendo, parece que talvez eu não tenha respondido à pergunta subjacente:
Usar "busca" no nível do aplicativo (na verdade, kernel) não custa necessariamente nenhuma "busca" no disco - tudo o que faz é atualizar o número de deslocamento associado ao identificador do arquivo.
Depois que você pedir ao kernel para ler ou escrever, ele traduzirá esse deslocamento em um deslocamento de disco, o que pode envolver a leitura de blocos para descobrir isso, mas tem o melhor custo de uma busca - assim como faria seu acesso direto.
É absolutamente possível fazer isso: afinal, é exatamente isso que o driver do sistema de arquivos faz, então deve ser possível para outra pessoa. Tudo que você precisa é de acesso ao disco bruto.
Lá são de exemplosde 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ê terá alguns desafios técnicos que dificultam a execução - porque o conteúdo do disco está mudando de uma maneira que você não consegue ver - mas ainda é possível.
Você também pode perguntar diretamente ao kernel; oxfs_bmapferramenta faz isso, e pelo menos alguns sistemas de arquivos implementam a mesma interface para que você possa perguntar diretamente.
O cálculo da localização exigirá o mesmo número de buscas que o kernel realizaria, portanto, é improvável que você realmente salvequalquer coisaFazendo isso.
Responder3
Eu não acho.
Se você abrir o arquivo, você estará no início (para leitura/gravação) ou no final (para acréscimo). Mesmo no "modo de atualização", você não chegará simplesmente a um local especificado no meio do arquivo.
Acho que o melhor que você pode fazer é o que já escapou: se você puder calcular o deslocamento desde o início, poderá procurar diretamente esse local e ler os dados. Não acho que isso envolveria operações de leitura excessivas no meio. A próxima leitura após abrir o arquivo deve estar no deslocamento calculado.