Questão Como aplicativos (e SO) lidam com arquivos muito grandes?


Por exemplo, eu tenho arquivo de vídeo que é 11.8 Gb, mas minha memória RAM de apenas 2 GB. Como o VLC (ou outro software) lida com isso? Como eles carregam na memória? Eu usei a ferramenta VMMap (do sysinternals) para dar uma olhada na memória e vi:

160000K privados

Conjunto de trabalho 100000K

Obviamente, é muito menos do que 11,8 Gb - Então, como isso aconteceu?

Esta questão é não somente sobre o vídeo. Eu gostaria de saber como o computador, em geral, lida com arquivos muito grandes.


4


origem




Respostas:


Isso é tão complicado que é extremamente difícil até mesmo começar a explicar, então vou apenas mencionar algumas maneiras básicas que os programas podem funcionar.

A primeira e a maneira mais óbvia, que geralmente é a mais lenta, é trabalhar diretamente com o arquivo no disco. Basicamente, cada bloco no disco tem seu próprio endereço lógico e um aplicativo pode trabalhar diretamente com dados no disco. Então, se eu estou projetando um editor de texto simples, eu poderia carregar uma tela de texto na memória de vídeo do disco e gravar as alterações diretamente no disco assim que elas forem feitas. Este tipo de abordagem é (tanto quanto eu sei) quase nunca usado hoje por causa de suas inúmeras desvantagens. O primeiro problema é que os discos são muito lentos quando comparados com a memória RAM que a CPU gastaria praticamente todo o tempo esperando que o disco terminasse de acompanhar os dados. O lado positivo é que quase não estamos usando RAM, pois todos os dados do disco podem ser transferidos diretamente para a RAM na placa de vídeo. Além de tudo isso, você tem sistemas operacionais modernos que tornam o acesso direto ao hardware ainda mais lento e, em muitos casos, impossível.

Em seguida, temos a solução (infelizmente) comum e mais óbvia para o problema de acesso a disco lento: Vamos apenas copiar o arquivo inteiro para a RAM e trabalhar na cópia da RAM. Quando terminarmos, de alguma forma, sincronizaremos a versão da RAM com a versão no disco e resolveremos o problema. Os sistemas operacionais modernos tornam isso relativamente fácil, pois o programador da aplicação pode usar os serviços fornecidos pelo sistema operacional para atualizar o arquivo sem pensar muito sobre como ele realmente é feito. A principal vantagem dessa abordagem é a velocidade. A RAM é (em comparação com os discos) extremamente rápida e os discos geralmente funcionam melhor quando uma quantidade maior de dados precisa ser transferida. Além disso, essa abordagem deixa o disco disponível para outros aplicativos e você pode editá-lo enquanto outro aplicativo está trabalhando com o disco. A desvantagem é que é assumido que o arquivo inteiro pode ser carregado na RAM em um período de tempo razoável e que o arquivo deixará espaço suficiente para outras tarefas na RAM. Às vezes isso não é verdade. Por exemplo, uma vez eu tive que abrir um arquivo de texto ~ 3.5 GiB e descobriu-se que a maioria dos aplicativos supõe que o arquivo de texto se encaixa na RAM.

A próxima abordagem que, em geral, é usada quando estamos trabalhando com aplicativos que esperam arquivos grandes é carregar uma parte do arquivo na RAM e trabalhar com ela. Quando terminarmos, salvaremos essa parte no disco e leremos a próxima parte. Como exatamente isso funciona depende da estrutura do próprio arquivo.
Em alguns tipos de arquivo, você pode encontrar um índice no início do arquivo que pode ser carregado na RAM e usá-lo para determinar posteriormente os endereços lógicos das partes interessantes do arquivo. Em alguns outros tipos de arquivo, você pode precisar procurar o arquivo inteiro para obter a seção que possui os dados necessários e, em seguida, apenas carregar essa parte do arquivo na RAM.

Essa abordagem também oferece espaço para otimizações inteligentes, como permitir a edição de uma parte do arquivo enquanto outra parte está sendo carregada na RAM em segundo plano para minimizar o tempo de espera necessário para abrir o arquivo e assim por diante.

Assim, no exemplo do arquivo de vídeo, alguns dados sobre o formato em si seriam codificados no início da multa e, mais tarde, o programa que reproduz o arquivo precisará ter apenas na memória a parte do arquivo que está sendo reproduzido atualmente. Para tornar a reprodução mais suave, os programas também manterão parte do arquivo que ainda será reproduzido na RAM. Normalmente, não é fácil determinar exatamente quanto tempo levará para o disco acessar os dados. Por exemplo, devido à fragmentação, uma parte do arquivo pode estar no início do disco enquanto uma parte pode estar no final do disco. Além disso, ao mesmo tempo em que o vídeo é reproduzido, outro aplicativo pode tentar gravar grandes quantidades de dados no disco. Como o player de vídeo já possui algum buffer na RAM, a reprodução deve continuar sem interrupções visíveis.

Essa abordagem tem a vantagem de usar menos RAM do que a anterior e, ao mesmo tempo, ser razoavelmente rápida para os usos que o programador prevê. A desvantagem é que você está confiando no programador para prever quais partes do arquivo serão usadas normalmente e como e, às vezes, o padrão de uso esperado pode ser diferente do padrão de uso real. A outra desvantagem é que é preciso esforço para determinar com precisão qual parte do arquivo precisa estar na RAM e qual a extensão dessa parte precisa ser. Se a parte é muito pequena, você não está ganhando velocidade suficiente e se a parte é muito grande, você está tomando a RAM.

Então, para resumir as 3 opções que eu descrevi: A primeira seria garoto na escola primária que está sublinhando cada letra que ele vê com um lápis enquanto se esforça para ler uma palavra.

O segundo seria imprimir todo o texto em uma única página e, se a página for tão grande quanto uma parede, poderemos ter alguns problemas.

A terceira opção seria como ler um livro. Você abre o livro em uma determinada página e, bem ao lado, você tem outra página aberta! Quando você terminar de ler os dois, você passa para o próximo par.

Note que nesta resposta eu não discuti muito sobre incontáveis ​​caches e camadas de abstração que existem em computadores modernos entre o disco, RAM e processador. Por exemplo, em uma situação do mundo real, se você tiver um programa que está executando um disco rígido e outro que tenta salvar um arquivo pequeno, esse arquivo pode ser armazenado em algum lugar na RAM em cache até que o disco tenha tempo livre suficiente para escrevê-lo . Além disso, o próprio disco tem seu cache interno ganho e pode armazenar o arquivo por algum tempo antes de gravá-lo no disco. Além disso, ao ler, o próprio SO pode carregar na RAM mais blocos de disco do que um aplicativo solicitado porque (corretamente ou não) previu que o aplicativo pode precisar deles em breve. A mesma coisa vale para o cache de disco também. Então, pode ser que o disco não seja realmente um disco, mas um RAID e que tenhamos um cache no controlador RAID e em cada disco individual e assim por diante.


4





Quando você lê um livro, você não se lembra de cada palavra. Você se lembra dos detalhes importantes que são relevantes para o resto da história. Se precisar se lembrar de mais detalhes, você pode voltar e ler uma página novamente. Você encontra a página procurando o número da página no índice ou conteúdo.

Quando um computador reproduz um vídeo, ele lê tantos segundos de dados de vídeo para que tenha dados suficientes para iniciar o processamento. Ele começa a gerar quadros de vídeo e os filas para serem exibidos no monitor. Ele esquece os dados de vídeo depois de processá-los, pois não é mais necessário. Ele carrega mais dados de vídeo em seu lugar. Depois que um quadro de vídeo é exibido, ele também é esquecido, pois não é mais necessário. Se o usuário rebobina o vídeo, o computador retrocede ao ponto apropriado no arquivo e repete o processo de ler dados de vídeo e gerar e enfileirar quadros de vídeo.

Para outros formatos de arquivo, o computador atuará de maneira semelhante. Ele só lerá e processará a parte do arquivo que é solicitada no momento.


1



It will only read and process the part of the file that is currently requested. Infelizmente, nem sempre é o caso. Alguns programas podem assumir que o arquivo inteiro se encaixará na RAM e tentará carregá-lo inteiro. Tempos divertidos acontecem se não puderem. - AndrejaKo
Claro, mas esse é provavelmente o programa errado para o trabalho. Quando eu digo "um computador", eu deveria estar dizendo "um programa projetado para ler arquivos grandes". - Hand-E-Food