Um sistema de arquivos 'reverso'?

1

Seguindo uma pergunta perguntei em StackOverflow , existem sistemas de arquivos nos quais os dados são gravados" de ponta a ponta "ou" de baixo para cima ", em vez de de cima para baixo ?

Especificamente, eu estou procurando (talvez uma construção específica) uma maneira de armazenar arquivos de log em um formato mais recente ( a la como os blogs e sites de notícias são organizados, com o mais recente no topo).

Existe tal animal? Se sim, o que é e onde pode ser encontrado?

    
por warren 25.10.2010 / 19:29

6 respostas

3

O que você está pedindo não é apenas um sistema de arquivos "invertido". Você quer um sistema de arquivos estruturado por registro , “revertido”, ou seja, um sistema de arquivos de registro em que o registro adicionado aparece pela última vez primeiro no arquivo. Na verdade, o aspecto invertido provavelmente seria implementado como "você pode inserir um registro antes do primeiro registro existente".

As interfaces do sistema de arquivos encontradas no sistema operacional normalmente encontradas em PCs (Unix, Windows e outras mais exóticas) são estruturadas apenas em bytes - elas não têm noção de registro. Então você está sem sorte.

Uma abordagem possível seria tornar cada entrada de log um arquivo separado no diretório. Em seguida, percorra o diretório na ordem inversa do tempo de criação do arquivo, ou na ordem inversa dos nomes, se você der nomes monotonicamente crescentes para as entradas de log. Como é provável que você tenha um grande número de entradas de log, certifique-se de usar um sistema de arquivos que suporte diretórios grandes (por exemplo, no Linux reiserfs e ext3 com o recurso dir_index são ok mas ext2 não), ou então use subdiretórios (um para as primeiras 1000 entradas, uma para os próximos 1000 e assim por diante).

Outra abordagem seria usar um banco de dados mais sofisticado, por exemplo, um que você possa consultar em SQL e apenas selecionar os registros em ordem inversa de sua criação ( SELECT message FROM logs ORDER BY date DESC ).

    
por 25.10.2010 / 22:43
2

Eu não tenho certeza se não existe nenhum, mas certamente nunca ouvi falar de um. Se eles puderem ser feitos, eu acho que haveria algumas grandes desvantagens.

O uso prévio de um arquivo geralmente requer uma cópia completa dos dados existentes. Em um sistema de arquivos, você pode manipulá-lo para adicionar um bloco ao início do arquivo, mas isso ainda causa alguns pequenos problemas. Blocos com espaço livre teriam que manter o espaço livre no começo, portanto, seria muito provável que fosse necessário procurar pela unidade para encontrar o local adequado.

O manuseio de espaço livre na unidade, quando se trabalha para trás, se tornaria uma grande dor. Isso contradizia a maioria das técnicas de programação, já que você teria que encontrar o índice máximo e depois trabalhar de volta a partir dele.

Eu posso imaginar que isso diminuiria a velocidade em arquivos grandes e definitivamente seria algo ridículo de se programar.

Em vez de encontrar um sistema de arquivos reverso, por que você não pode simplesmente escrever o arquivo como de costume e analisá-lo ao contrário? Elabore um esquema básico de formatação de mensagens, leia o arquivo e analise as mensagens dele e, em seguida, exiba-as por último. Se você precisar apenas das últimas mensagens, procure o final do arquivo e, em seguida, retorne as mensagens n . Teria um resultado semelhante, mas com muito menos trabalho e desempenho comparável ou melhor.

    
por 25.10.2010 / 20:42
1

Você precisa separar as ideias de armazenamento e recuperação . Mesmo nos blogs que você menciona, as entradas provavelmente são armazenadas em ordem cronológica avançada, mas exibidas em ordem cronológica inversa (ignorando o fato de que isso é facilitado usando armazenamento estruturado) .

É possível criar um sistema de armazenamento estruturado simplista que armazene entradas na ordem direta familiar com "registros" de comprimento livre e variável com ponteiros de deslocamento de byte armazenados em um arquivo de recursos em um formato de tamanho fixo ( 64 bits suportariam  arquivos de mais de 18 milhões de terabytes). Buscando o último registro ou o registro nth ou o registro last - n no arquivo do ponteiro, o byte para o qual ele aponta no arquivo principal seria trivial e rápido. O truque que um sistema de arquivos especial ou driver permitiria seria tornar isso atômico e tornar o arquivo de recurso transparente.

    
por 25.10.2010 / 23:28
0

Você está procurando endianness qual é a ordem de bytes? Por que você deseja que os arquivos de log sejam organizados no nível do sistema de arquivos, em vez de apenas ordená-los, digamos ls ?

Se for sobre Endianness, existem vários sistemas de arquivos disponíveis.

    
por 25.10.2010 / 19:35
0

Dois pensamentos vêm à mente:

Alguns sistemas de controle de versão armazenam a primeira versão do arquivo controlado na íntegra e todas as versões subsequentes como alterações, onde outros armazenam a versão atual do arquivo controlado na íntegra e todas as versões anteriores como alterações.

Se você registrar eventos de tempo de execução em um banco de dados em vez de um arquivo simples, pode ser indecoroso se o banco de dados está armazenando eventos sequencialmente, de forma inversa ou aleatória.

    
por 25.10.2010 / 20:36
0

Infelizmente, não há uma maneira fácil de fazer o que você deseja. Isso exigiria uma reescrita do arquivo inteiro toda vez que uma entrada fosse adicionada. Seria LENTO e fica mais lento conforme o arquivo cresce. Eu acho que o melhor que você pode fazer é um log de seqüência de caracteres que é invertido no visor, mas mantido em ordem "normal" no disco. Qualquer banco de dados SQL pode fazer isso facilmente, mas pode ser mais sobrecarga do que você deseja.

    
por 25.10.2010 / 23:32