Pergunta

poderia alguém me ajuda a tentar entender como unidade buscando obras duro.

Eu tenho um pequeno arquivo de dados binário que o desempenho de leitura é absolutamente essencial. Se eu precisar pular alguns bytes no arquivo é mais rápido para uso seek () ou para ler (), em seguida, descartar os dados indesejados.

Se o tempo médio de busca de um disco rígido é de 10ms e a velocidade de leitura é 300MB / s Eu calculei que é mais rápido para ler () do que buscar () com um valor menor do que 3 MB. É verdade? Existe uma sobrecarga ao realizar uma nova busca, que lendo um fluxo existente não tem?

Qual você acha que seja uma estrutura de arquivo mais adequado para um índice.

Entry1:Value:PointerIntoToData
Entry2:Value:PointerIntoToData
Entry3:Value:PointerIntoToData
Data, Data, Data

Or

Entry1:Value:Data
Entry2:Value:Data
Entry3:Value:Data

Ao ler uma entrada se o valor não é correto ele será ignorado. Então, quando a transmissão do ficheiro é mais rápido para: 1. uso quando não é necessária uma entrada seek () para pular sobre ele 2. quando uma entrada não é necessário lê-lo, em seguida, descartar os dados 3. ou a primeira estrutura de uso, quando é necessária uma entrada buscar () para um repositório de dados no final.

A entrada é de 4 bytes, o valor é de 8 bytes de dados e é 12KB

Felicidades

Foi útil?

Solução

Todos buscam chamada de sistema que está mudando a posição no arquivo onde a próxima leitura será. Ele não se move a cabeça da unidade. cabeçotes da unidade mover quando os dados são lidos ou escritos e você não tem controle direto sobre o sistema operacional irá fazer a seguir.

Leitura grande quantidade de dados que você não vai precisar tem impacto porque todos os dados de leitura precisa de espaço nos buffers do sistema operacional e faz com que os dados mais antigos para ser descartado. Então, usando buscar mais arquivos grandes vai mexer com sistema de arquivos de cache menos.


Tudo que eu escrever abaixo assume que você não pode caber banco de dados inteiro na memória. Se você puder, apenas fazer isso. Leia tudo e tentar acrescentar dados novos e alterados no final do arquivo. Não se preocupe com espaço desperdiçado, basta fazer alguns compactação de vez em quando.


Se o seu banco de dados é muito grande:

Os dados são lidos e gravados unidade física em blocos (ou páginas). Da mesma forma a unidade básica de IO de disco em seu sistema operacional é a página. Se OS armazena em cache dados do disco é também em páginas inteiras. Então, pensando se você precisa para avançar alguns bytes utilizando solicitar ou leitura faz pouco sentido. Se você quiser torná-lo rápido, você precisa levar em conta a forma como disco IO realmente funciona.

Em primeiro lugar, já mencionado por nobugz, localidade de referência. Se os dados que você usa em cada operação situa-se perto juntos em um arquivo, o sistema operacional terá que ler ou escrever menos páginas. Por outro lado, se você espalhar seus dados, muitas páginas terão de ser lido ou escrito de uma vez, que será sempre lento.

Como a estrutura de dados de índice. Tipicamente eles são organizadas como B-árvores . É uma estrutura de dados feito especialmente para uma procura eficaz de grandes quantidades de dados armazenados na memória com paginada leituras e gravações.

E ambas as estratégias para dados organização é usado na prática. Por exemplo, MS SQL Server armazena dados padrão a primeira maneira: os dados são armazenados separadamente e índices contêm apenas dados de colunas indexadas e endereços físicos de linhas de dados em arquivos. Mas se você define índice de cluster, em seguida, todos os dados serão armazenados dentro deste índice. Todos os outros índices irá apontar para os dados através agrupado de dice de chave, em vez de endereço físico. A primeira maneira é mais simples, mas o outro pode ser muito mais eficaz se você costuma fazer exames de intervalos de dados com base no índice de cluster.

Outras dicas

Como "absolutamente essencial" é buscar o acesso? Você testou o aplicativo com uma solução não-ideal ainda? Durante esse teste, não é referência para determinar onde os reais gargalos são? Se você não tem, você vai se surpreender com os resultados.

Em seguida, tentar métodos diferentes e comparar os tempos de execução. Ensaio em diferentes cargas do sistema (ou seja, quando o sistema estiver ocioso, exceto para a sua aplicação, e quando ele está ocupado).

Considere que suas otimizações com base no seu disco rígido atual pode ficar incorrecto quando um novo disco rígido mais rápido, tem diferentes otimizações internas que lançam o seu trabalho fora da janela.

A leitura sequencial é sempre mais rápido do que aquele que exige uma cabeça Seek (não a posição buscar). perf disco rígido típico para leitura sequencial é 50-60 MB / segundo, procurando que gotas para baixo para o pior caso de ~ 0,4 MB / s. Uma vez que as cabeças da unidade estão posicionados, você essencialmente obter os dados do cilindro de forma gratuita. O cache do sistema de arquivos leva vantagem de que por setores pré-leitura de um cilindro.

No entanto, você não tem controle sobre a colocação de seus dados em cilindros de disco. Também não se pode adivinhar a geometria do disco. Note-se que o rendimento pode ficar significativamente pior ao longo do tempo quando o volume fica fragmentado. Você precisa olhar para perf armazenando em cache de dados na memória. Nesse ponto, você se preocupar com localidade de referência.

Você pode sempre mapear o arquivo na memória e depois acessá-lo através de ponteiros e tal. Isso geralmente deve fazer seus acessos mais simples e mais rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top