OK, uma lista bem legal que você tem lá. Deixe-me responder inline
- Como aplicar o melhor erro de tratamento de erro de trapping aqui? Veja meu script para o exemplo na fonte. Thread Como fazer o erro de trapping e Swapoff se erro / aviso?.
Eu não gosto do conceito deste script. Que você tenha um disco rígido externo que está tentando usar como swap é apenas uma má ideia. Se você realmente pretende fazer isso regularmente, redimensione suas partições para colocar uma partição swap adequada, adicione um arquivo de swap ou apenas compre um disco interno maior.
- Como colocar avisos se o tamanho da matriz exceder o tamanho do swap?
Apenas faça as contas. Se você souber o tamanho da matriz antes do início do programa, calcule o tamanho em MiB e compare-o com o swap disponível.
- Como ter uma barra de progresso no cálculo da sua enorme matriz no Matlab?
o matlab tem um direito de API? Eu não acho que este é o fórum certo para essa pergunta. Mesmo se você tivesse uma API, você estaria bloqueando o IO via swap, então seria apenas uma barra de progresso irregular que não reflete a realidade.
- Como matar o progresso ocupado e / ou swapon -s / swapoff na iteração (2)?
Você não faz. só porque você terminou com o cálculo não significa que o sistema operacional é feito com os recursos que você alocou. Quando terminar de escrever para trocar, vai liberar. Você consumiu tanta memória que muitos aplicativos não conseguem a memória de que precisam, então estão usando o swap também. Apenas deixe-o ligado e deixe o sistema operacional fazer isso. Antes de executar sua próxima execução, limpe os caches.
echo 3 > /proc/sys/vm/drop_caches
Há provavelmente mais do que isso, não sou um especialista em VM Linux. Vale a pena investigar como o alocador SLAB / SLUB funciona e como ajustá-lo para seus grandes requisitos de memória. Você pode conseguir MLOCK matlab na memória. Isso força o SO a reservar memória para você, ou simplesmente não inicia, você também precisa desbloqueá-lo quando terminar. Eu posso fazer isso com a API C muito bem, mas eu não sei como você faria isso fora de um processo que não posso recompilar, isso exigiria alguma pesquisa.
Finalmente, este é o tipo de material para o qual o EC2 foi criado. Parece que o 16G é o que você precisa, um m4.4xlarge tem 64G ram @ $ 0.958 por hora. Isso é menos que um copo de café. Script sua instalação de matlab usando um charme juju ou similar e transformar a coisa toda em um cálculo como um serviço.
16G é 16 GB?
- Sim, normalmente quando deixamos o sufixo, queremos dizer números base2 em unidades de bytes. Se você quiser concisar você escreveria 16GiB.
"Preciso de matrizes com & gt; 100 GB. Não sei se você pode fazer isso com o EC2."
- O EC2 tem máquinas com até 2 TB de memória principal. Veja por si mesmo. link
Você deve limpar seus caches também por echo 3 > /proc/sys/vm/drop_caches
?
- Sim, não faz mal sempre fazer isso. Veja Documentação / sysctl / vm.txt no kernel do linux.
Como você pode MLOCK Matlab na memória?
- %código%. Embora eu tenha brincado quando citei isso. Esta chamada assegura que você pode alocar toda a memória que você quer e evitar que ela seja trocada, nunca usará memória virtual. Não é isso que você quer.
Eu acho que você pode ligar a API C ao Matlab. - Você tem alguma idéia de desativar o swap se houver alguma falha nos processos?
- Eu vou ser franco aqui, o conceito de micro gerenciamento de arquivos de swap da maneira que você propõe é ridículo. O trabalho do sistema operacional é gerenciar os recursos e distribuí-los de maneira justa & amp; forma consistente. Uma vez que você tenha mais recursos, vai usá-los como achar melhor. Você não consegue dizer quando acaba e tira os recursos de baixo, o sistema operacional informa quando é feito.
Quando peço ao sistema operacional um espaço de endereço de memória, às vezes nem sempre isso é bem-sucedido, isso não significa que não possa tentar novamente. O matlab não consegue chamar o malloc duas vezes é o problema do matlab.
Então, para afetar a mudança que você quer, se esse espaço de 100G é realmente um prêmio , você precisa descobrir como dizer ao sistema operacional para cortar o espaço ocupado pela memória (limpando caches) para iniciantes) para que o gerenciador de memória não sinta a necessidade de usar o espaço adicional de troca que foi fornecido. Então, e só então, você pode pedir ao gerenciador de memória para liberar o arquivo de troca.
É fácil desenvolver coisas como memória e discos, é muito mais difícil reduzi-las. O encolhimento força um reequilíbrio de todos os usuários que possuem recursos alocados nesse espaço. Se eu dissesse "Eu tenho uma matriz de armazenamento de 100 TB, mas agora eu só preciso de 60 TB, por que é quando eu removo 40 TB de disco que a matriz pára de funcionar?" Bem, a resposta seria óbvia, certo?
Então aqui estão suas opções como eu vejo.
-
investigue a API matlab C para ver se você pode obter melhor controle sobre como a memória é alocada para esses conjuntos de trabalho massivos.
-
refatorie sua computação para calcular o que você tem agora usando sub-matrizes ou alguma outra representação de dados esparsos.
-
escreva seu próprio programa em C / C ++ usando a infinidade de bibliotecas de álgebra linear para executar o cálculo e use
man mlock
oumalloc
anonymous para alocar o espaço de endereço que você precisa.