Como limitar os recursos usados pelo sistema? – c# .net winforms

Pergunta:


Tenho um laço de repetição que faz várias iterações e possui em seu escopo cálculos que exigem muito processamento.

O problema é que ao executar o trecho do código, o uso do processador se elevar gradativamente, até travar a aplicação e posteriormente o sistema operacional.

Bem, meu objetivo é limitar de alguma forma o consumo desses recursos que levam ao travamento do sistema. Sei que isso aumentará o tempo de resposta, mas minha prioridade no momento é não travar o sistema.

O projeto está em Windows Forms, mas este trecho está em uma
Class Library.

Veja um trecho do código:

private static string[] TodosPossiveis(char[,] letras)
{
            int linhas = letras.GetUpperBound(1) + 1;
            int colunas = letras.GetUpperBound(0) + 1;
            int max = (int)Math.Pow(linhas, colunas);
            string[] todos = new string[max];


            int[] posY = new int[colunas];

            int atual = 0;
            while (atual < max)
            {

                string nova = "";
                for (int i = 0; i < colunas; i++)
                {
                    nova += letras[i, posY[i]];
                }
                for (int i = colunas - 1; i > -1; i--)
                {
                    posY[i]++;
                    if (posY[i] == linhas)
                    {
                        posY[i] = 0;
                    }
                    else
                    {
                        break;
                    }
                }
                todos[atual++] = nova;
            }

            return todos;
 }

Este método recebe um conjunto de caracteres e devolve todas as combinações possíveis.

Tentei usar apenas variáveis primitivas para melhorar no desempenho, mas mesmo assim, ao receber um conjunto grande de caracteres o sistema acaba travando.

Autor da pergunta Jedaias Rodrigues

Maniero

A primeira tarefa que deve fazer é pensar se tem uma forma melhor de executar isto. Eu duvido que precise de uma algoritmo tão pesado. Ou ele não é tão pesado assim. Sem um contexto completo não dá para ajudar. E nem é o foco da pergunta.

Avalie se não está tendo problema de memória. Sem saber exatamente onde está o problema, vai achar a solução errada.

Vou repetir, a solução real é perfilar e achar um algoritmo, e talvez estrutura de dados, melhores.

Se não consegue melhorá-lo e realmente esteja atrapalhando, então o sistema operacional é que deve ser responsável por dar mais ou menos prioridade ao processo.

Dá para fazer isto chamando o programa com start ou mandar seu próprio código diminuir prioridade com a propriedade Process.PriorityClass. Um BelowNormal deve servir, ou pode exagerar e colocar em Idle.

A propriedade Process.ProcessorAffinity pode ajudar evitando que todos os cores sejam usados pelo processo.

Existe a possibilidade de criar algum código que minimize isto, mas não acho um boa solução na maioria dos casos. É gambiarra maior ainda.

Cuidado para não fazer gambiarras que parecem resolver e só pioram.

Usando esse tutorial você vai conseguir separar esse processamento. Vai consumir o recurso da maquina, mas não vai travar a maquina, ainda via poder calcular percentual, contar o processamento, etc atualizando na tela.

Veja esse Link

Tendo algum problema no seu código é só dizer, podemos fazer o acompanhamento em outra pergunta se for o caso.

Espero ter ajudado

Eu trabalhei em um sistema de Orçamento de Recursos Humanos que processava o orçamento da folha de pagamento de mais de 500 mil funcionários, com várias etapas de cálculo que realmente consumiam muito os recursos do sistema operacional.

A solução que encontraram foi deixar uma máquina dedicada para o cálculo, e a chamaram convenientemente de “Máquina de Cálculo”. Dessa forma, o sistema ficava separado do processamento do cálculo, e permitia que o usuário solicitasse a execução do cálculo para pegar os resultados depois que já estivessem prontos.

Talvez isso funcione para você também. Então, em vez de tentar processar tudo de uma vez e já mostrar os resultados para o usuário, basta você notificar o usuário que o processamento foi iniciado e está em andamento, e depois que o processamento for concluído você notifica ao usuário e apresenta os resultados a ele. Isso pode ser tanto em arquivo, relatório ou em uma tela de seu sistema.

Eu sei que é um post antigo, mas ainda assim tem alguns pontos que valem ser listados…

1) A carga de memória pesada e lentidão não surpreendem, uma vez que vc está tentando alocar todas as possibilidades em memória ANTES de retornar. Se vc passar um array de input de 10×10, a variável max será 1E10, ou 1 com 10 zeros na frente. Pense que se vc tentar alocar um array de retorno deste tamanho, ele terá no mínimo essa quantidade de consumo de bytes, o que dá uns 9,3 GIGAS de memória para alocar isso tudo… fora o tamanho de cada palavra em si…

Um jeito de contornar isso é usar o operador yield return. Veja estes links:

Com isso, vc evita alocar tudo em memória. Outro ponto é mudar o retorno para IEnumerable<string>.

2) No trecho nova += letras[i, posY[i]];, ao invés de usar o operador += use um objeto StringBuilder – veja exemplos aqui.
A cada iteração nesta linha, o .NET é obrigado a realocar memória para construir a string atual.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *