none
Meu programa em C# esta aquecendo muito o processador RRS feed

  • Pergunta

  •  Boa tarde, eu estou fazendo um programa simples em C# que verifica quando arquivos de um diretório são iguais, se eles forem iguais o arquivo é excluido. 

     Ele simplesmente armazena todos os bytes dos arquivos que serão comparados em uma Array e depois passa por um for que verifica todos os bytes.

     Para evitar que meu programa travasse, a função que faz o trabalho é chamada em uma thread separada, mas o problema é que quando eu executo o programa além do processo ser muito demorado, o processador chega a 100º C em menos de 20 segundos.

    domingo, 29 de setembro de 2013 17:59

Respostas

  • Coloca algumas verificações chaves antes

    Tamanho total do arquivo

    Inicio e fim de arquivo

    alguns pontos baseados em % do arquivo por amostragem,

    ex:

    10-100 bytes em 5% do arquivo

    10-100 bytes em 10% do arquivo

    10-100 bytes em 15% do arquivo

    etc....

    Apenas se passar em todas essas verificações você verifica todo o arquivo, vai ter um bom ganho

    Não sei qual sua infra, mas caso seja arquivos muito grandes, algo de tipo 500Mb+ e tiver a disponibilidade de usar a GPU de sua placa de vídeo, separe em blocos menores e envie para a GPU calcular, é extremamente mais rápido e você pode enviar várias treads para a GPU tratar.

    Segue um tutorial de OpenCl

    http://www.cmsoft.com.br/index.php?option=com_content&view=category&layout=blog&id=64&Itemid=104

    • Marcado como Resposta Giovani Cr terça-feira, 8 de outubro de 2013 13:32
    terça-feira, 1 de outubro de 2013 21:36

Todas as Respostas

  •  Boa tarde, eu estou fazendo um programa simples em C# que verifica quando arquivos de um diretório são iguais, se eles forem iguais o arquivo é excluido. 

     Ele simplesmente armazena todos os bytes dos arquivos que serão comparados em uma Array e depois passa por um for que verifica todos os bytes.

     Para evitar que meu programa travasse, a função que faz o trabalho é chamada em uma thread separada, mas o problema é que quando eu executo o programa além do processo ser muito demorado, o processador chega a 100º C em menos de 20 segundos.

    Cole seu código por FAVOR?

    Fúlvio Cezar Canducci Dias

    segunda-feira, 30 de setembro de 2013 00:33
  • Bom dia, @Felipe

    Você pode nos dar alguns detalhes mais específicos?

    - Como por exemplo quantos núcleos tem seu processador?

    - Quantas threads simultâneas seu programa iniciou?

    - Qual o uso do processador nesse momento?



    Peterson Roberto Oliveira Seridonio
    Desenvolvedor C#
    MCTS Windows 7

    segunda-feira, 30 de setembro de 2013 11:38
  • Coloca algumas verificações chaves antes

    Tamanho total do arquivo

    Inicio e fim de arquivo

    alguns pontos baseados em % do arquivo por amostragem,

    ex:

    10-100 bytes em 5% do arquivo

    10-100 bytes em 10% do arquivo

    10-100 bytes em 15% do arquivo

    etc....

    Apenas se passar em todas essas verificações você verifica todo o arquivo, vai ter um bom ganho

    Não sei qual sua infra, mas caso seja arquivos muito grandes, algo de tipo 500Mb+ e tiver a disponibilidade de usar a GPU de sua placa de vídeo, separe em blocos menores e envie para a GPU calcular, é extremamente mais rápido e você pode enviar várias treads para a GPU tratar.

    Segue um tutorial de OpenCl

    http://www.cmsoft.com.br/index.php?option=com_content&view=category&layout=blog&id=64&Itemid=104

    • Marcado como Resposta Giovani Cr terça-feira, 8 de outubro de 2013 13:32
    terça-feira, 1 de outubro de 2013 21:36
  •  Este é o código da função que é chamado pela thread:

            public void VerifyAllFiles()
            {
                toolStripStatusLabel2.Text = "Processing"; // altera o valor do label da barra de status
                int total = 0;
                if (Directory.Exists(textBox1.Text))
                {
                    richTextBox1.Text += "Process Started\n";
                    string[] AllFiles = Directory.GetFiles(textBox1.Text, textBox2.Text, SOByBool(checkBox13.Checked)); // Recebe o diretório dos arquivos
                    progressBar1.Maximum = AllFiles.Length; // Altera o valor maximo do progress bar
                    
                    for (int C = 0; C < AllFiles.Length; C++)
                    {
                        string FileDir = AllFiles[C];
                        progressBar1.Value = C;
                        if (File.Exists(FileDir))
                        {
                            label4.Text = "Current file: " + FileDir;
                            richTextBox1.Text += "File - " + FileDir + "\n";
                            for (int D = 0; D < AllFiles.Length; D++)
                            {
                                string SecondFileDir = AllFiles[D];
                                label5.Text = "Compared with: " + SecondFileDir;
                                if (File.Exists(SecondFileDir) && File.Exists(FileDir))
                                {
                                    if (C == D)
                                    {
                                        richTextBox1.Text += "This is this" + "\n";
                                    }
                                    else
                                    {
                                        richTextBox1.Text += "-----Compared with " + SecondFileDir + "\n";
                                        bool is_equal = false;

                                            if (radioButton1.Checked == true)
                                            {
                                                // Código que compara pelo tamanho
                                                FileInfo primary_info = new FileInfo(FileDir);
                                                FileInfo secondary_info = new FileInfo(SecondFileDir);
                                                //
                                                if (primary_info.Length == secondary_info.Length)
                                                {
                                                    richTextBox1.Text += "-----Is Equal" + "\n";
                                                    is_equal = true;
                                                    richTextBox1.Text += "-----Deleting file " + SecondFileDir + "\n";
                                                    total++;
                                                    File.Delete(FileDir);
                                                }
                                                else
                                                {
                                                    richTextBox1.Text += "-----Is different" + "\n";
                                                }
                                            }
                                            else if (radioButton2.Checked == true)
                                            {
                                                // Código que compara os arquivos byte por byte
                                                byte[] bytes_primary = File.ReadAllBytes(FileDir);
                                                byte[] bytes_secondary = File.ReadAllBytes(SecondFileDir);
                                                //
                                                if (bytes_primary.Length == bytes_secondary.Length)
                                                {
                                                    for (int E = 0; E < bytes_primary.Length; E++)
                                                    {
                                                        if (bytes_primary[E] == bytes_secondary[E])
                                                        {
                                                            if (E == bytes_primary.Length - 1)
                                                            {
                                                                is_equal = true;
                                                                richTextBox1.Text += "-----Is Equal" + "\n";
                                                            }
                                                        }
                                                    }
                                                    if (is_equal == true)
                                                    {
                                                        richTextBox1.Text += "-----Deleting file " + SecondFileDir + "\n";
                                                        total++;
                                                        File.Delete(FileDir);
                                                        if (File.Exists(FileDir))
                                                        {
                                                            C++;
                                                        }
                                                    }
                                                }
                                            }
                                            else if (radioButton3.Checked == true)
                                            {
                                                // código que compara pelo nome
                                                if (Path.GetFileName(FileDir) == Path.GetFileName(SecondFileDir))
                                                {
                                                    richTextBox1.Text += "-----Is Equal" + "\n";
                                                    is_equal = true;
                                                    richTextBox1.Text += "-----Deleting file " + SecondFileDir + "\n";
                                                    total++;
                                                    File.Delete(SecondFileDir);
                                                }
                                            }
                                        progressBar1.Value = C;
                                    }
                                    richTextBox1.Text += "\n";
                                    System.Threading.Thread.Sleep((int)numericUpDown1.Value);
                                    toolStripStatusLabel2.Text = "Processing";
                                }
                            }
                        }
                    }
                    richTextBox1.Text += "Process Complete" + "\n";
                    MessageBox.Show("Process Complete! - " + total.ToString() + " Files deleted");
                    progressBar1.Value = progressBar1.Maximum;
                }
                else
                {
                    MessageBox.Show("Error, this directory don't exists");
                }
                Started = false;
                ResetFileInfo();
                toolStripStatusLabel2.Text = "Ready";
                
            }

    sábado, 12 de outubro de 2013 20:59
  •  O processador é de 2 núcleos de 3.1Ghz o uso do processador fica entre 80% e 100% e durante a execução o Resource Monitor registrou 8 Threads
    sábado, 12 de outubro de 2013 21:09