Notifications
Clear all

Limpar variaveis da memoria

11 Posts
2 Usuários
0 Reactions
6,067 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Bem,

fernando fernandes
Então, essas variáveis que você precisa em outras rotinas, você não as deve destruir até não precisar mais delas.
Mas acostume-se a sempre destruir aquelas que não são mais necessárias.

  '---------------------------------------------------------------------------------------
    ' Modulo    : xlApplication / Módulo
    ' Rotina    : RemoveObjectsFromMemory() / Sub
    ' Autor     : Jefferson Dantas (jefferdantas@gmail.com)
    ' Data      : 07/11/2012 - 16:42
    ' Revisão   : Fernando Fernandes (fernando.fernandes@outlook.com.br)
    ' Data      : 07/01/2013 (mdy)
    ' Proposta  : Remove crap from memory
    '---------------------------------------------------------------------------------------
    Public Sub RemoveObjectsFromMemory(ParamArray Objects() As Variant)
    On Error Resume Next 'Resume next necessario em caso de erro
    Dim Counter As Integer

        For Counter = 0 To UBound(Objects) Step 1
            Select Case TypeName(Objects(Counter))
                Case "Boolean"
                    Objects(Counter) = False
                   
                Case "Variant"
                    If VBA.IsArray(Objects(Counter)) Then Erase Objects(Counter)
                    Objects(Counter) = Empty
                   
                Case "String"
                    Objects(Counter) = vbNullString
                   
                Case "Worksheet"
                    Set Objects(Counter) = Nothing
               
                Case "Workbook"
                    Objects(Counter).Close SaveChanges:=False
                    Set Objects(Counter) = Nothing
               
                Case "Database", "Recordset2", "Recordset"
                    Objects(Counter).Close
                    Set Objects(Counter) = Nothing
                   
                Case Else
                    Set Objects(Counter) = Nothing
    'Suggestion:
                    If VBA.IsObject(Objects(Counter)) Then
                        Set Objects(Counter) = Nothing
                    Else
                        Objects(Counter) = Empty
                    End If
                   
            End Select
        Next Counter
    On Error GoTo 0
       
    End Sub

Mas como foi dito a macro fecha a planilha, então não pude usar.

Como estou na base do projeto, tenho que definir o rumo.

Olhei o uso de memoria que começou com 100m e quando vi estava em 700m no excel.
Como já tinha feito varias coisas, e aberto varias planilha não sei oq chegou a inchar a memoria usada.

Estou tentando definir como e oq liberar da memoria enquanto faço testes das novas macros.
= Nothing
= Empty
deram mensagem de erro

Então fiz testes de definição.

Public ColunO() As Variant
Public ColunD() As Variant

Sub mnmemoria()'usa Arrays publicas

ColunO = Range("A1:FF16000")
ColunD = ColunO
ColunO = ColunD
ColunD = Range("A1:FF16000")
MsgBox "olhe o gerenciador de tarefas novamente"
ColunD = Range("A1:F10")
ColunO = Range("A1:F10")
'ReDim ColunO(1)
'ReDim ColunD(1)

End Sub

Observando o gerenciador de tarefas
Com essa macro,
Ao trocar as seleções, pude perceber que Redim Libera a memoria usada.
A Redefinição de conteúdo tbm libera a memoria usada.

Na minha planilha o uso foi
De 77m para 199m, e depois voltou para 77m novamente.

Então em questão de "Arrays publicas "
Como a quantidade é limitada, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"
Ao final de processos grandes se pode usar Redim nomeArray(1)

Com variáveis definidas dentro das macros...

Sub arratest()
Dim arr(),arr2()
arr = Range("A1:FF16000")
arr2=arr
MsgBox  "olhe o gerenciador de tarefas novamente"
End Sub

Essa macro tbm liberou a memoria no final do processo.

Mas...
Depois de alguns testes, e alguns sobe e desce de uso de memoria,
"SEM FAZER NADA NO Excel"
de 77m o uso de memoria do excel já estava 82M

Ao final do processo, o uso de memoria cai para o nível que estava antes,
mas pouco tempo depois sobe um pouquinho .

Levando a crer que se a planilha ficar aberta horas seguidas com testes e mais testes, ou no uso normal.
Mesmo a memoria sendo liberada das variáveis o uso de memoria vai inchar.

Então, O que infla a memoria usada?
e oq fazer para isso não ocorrer?
tem que fechar e reabrir o excel para liberar memoria?

att

 
Postado : 03/08/2014 2:47 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Na minha planilha o uso foi
De 77m para 199m, e depois voltou para 77m novamente.

Exatamente. Matrizes inflam o uso da memória.

Então em questão de "Arrays publicas "
Como a quantidade é limitada

Pq vc tá insistindo nisso? Uma matriz até tem limite (como já falei), mas não por serem públicas... Sim pelo tamanho da tóra de dados que vc tenta enfiar nela...

, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"

"RE"definir é "RE"trabalho. Pense sempre se precisa mesmo redefinir algo ou se podia ter passado como parâmetro antes.

Ao final de processos grandes se pode usar Redim nomeArray(1)

O jeito certo de matar uma matriz inteira é:
Erase Matriz
Ela volta ser uma variável do tipo Variant sem conteúdo.
Se for usar meu código, chame-o assim:
Call RemoveObjectsFromMemory(Matriz)
Ele já faz isso pra vc. (O ReDim e o Redim Preserve usam mais processamento e por isso são mais lentos que simplesmente usar "Erase Matriz" ou ainda "Matriz = Empty".

Essa macro tbm liberou a memoria no final do processo.
Depois de alguns testes, e alguns sobe e desce de uso de memoria,
"SEM FAZER NADA NO Excel"
de 77m o uso de memoria do excel já estava 82M

Sim, conforme os Excéis ficam melhores e os Windows tb, eles estão gerenciando isso melhor. Mas como nunca sabemos aonde o usuário está rodando a macro, pode ser Excel antigo, pode ser Windows XP, o ideal é sempre fazermos o que podemos para deixar o "ambiente" igual ou melhor do que estava quando o encontramos (minha mãe me ensinou isso, qto a gotas de xixi na privada).
Como não podemos melhorá-lo, devemos eliminar tudo que enfiamos na memória.
Se você matar a matriz como eu to dizendo, sua chance de sucesso para voltar ao ponto de partida será melhor...

Então, O que infla a memoria usada?
e oq fazer para isso não ocorrer?
tem que fechar e reabrir o excel para liberar memoria?

Ótimas perguntas:
1) O que infla, é seu uso. O que você põe lá e não tira. Os arquivos que você abre e não fecha. As variáveis que você acha que não precisa limpar. E claro, sempre pode ter algo mais que eu não listei aqui. O ideal é vc desfazer SEMPRE o que você fez. Se o uso da memória ficar mais alto, paciência. Você terá feito sua parte. Entendeu ?
2) Fechar e reabrir o Excel certamente vai retornar seu uso de memória para o estado inicial.

 
Postado : 03/08/2014 4:09 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

eu tentei usar
Call RemoveObjectsFromMemory(Matriz)
mas não diminuiu a memoria usada
e como falei não tinha feito mais nada no excel apenas rodado essas macros de teste
e elas não alteram a planilha apenas pegam valores

bem estou tentando entender os procedimentos

ColunO = Empty gerou erro
Matriz = Empty nao limpou a memoria

estou usando variaveis publicas para usa-las em cascata
sempre são redefinidas ao inicio de um procedimento
eu defino procedimento como conjuntos de macros rodando um depois da outra pra gerar o efeito planejado

Ex.
vou pegar o Setor1 da aba plan2 , inverter os lados "Espelhar", e colar no setor2 da plan ativa

o procedimento ficaria assim

Call inicio
call SetorN(1,"plan2")
ColunO = sheets("plan2").Range(Ti & Li, Cf & Lf).Value2
Call Espelhar(ColunO, 1)
Cqo=Cq
Call SetorN(2)
call ColunasN(Cqo) 'ajusta quantidade de colunas do Setor2 para caber os dados que vai receber
Range(Ti & Li, Cf & Lf).Value2=ColunO
Call Final
FIM do Procedimento

no meu desenvolvimento fica ainda menor

call inicio
call Copia_SetorO(1,"plan2")
Call Espelhar(ColunO, 1)
call Colar_Setor(2,Coluno)
call final
FIM do Procedimento

Praticamente eu já fazia assim antes, mas não sabia usar Byref

No final disso tudo eu poderia matar "ColunO" que é uma array publica

Ed escreveu:Então em questão de "Arrays publicas "
Como a quantidade é limitada

Pq vc tá insistindo nisso? Uma matriz até tem limite (como já falei), mas não por serem públicas

Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)

Ed escreveu:, e sempre vai existir Redefinição de Conteúdo e Tamanho, não creio ter muitos problemas "acho"

"RE"definir é "RE"trabalho. Pense sempre se precisa mesmo redefinir algo ou se podia ter passado como parâmetro antes.

ainda estou me acostumando com ByRef, e tentando definir o uso em cascatas de procedimentos, que é o modo que vou usar.

Apenas mexo nessa planilha, quando comecei não sabia nem que existia variaveis publicas, e agora...
sei que meu desenvolvimento é lento, mas eu tento né...

Att.

 
Postado : 03/08/2014 5:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vamos lá:

Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)

Eu em mais de 10 anos de carreira nisso (que não é muito) nunca alcancei esse limite a que vc se refere, de qtd de variáveis públicas. Isso pra mim é, desculpe o termo, uma regra cagada. Pode haver, mas eu não o vi ainda. E acredite, eu vi muuuuuitos limites no Excel, mas esse definitivamente não é um deles.

ainda estou me acostumando com ByRef, e tentando definir o uso em cascatas de procedimentos, que é o modo que vou usar.

Isso é bom, acostume-se. Leve o tempo que for necessário.

Apenas mexo nessa planilha, quando comecei não sabia nem que existia variaveis publicas, e agora...
sei que meu desenvolvimento é lento, mas eu tento né...

Eu fico feliz com as discussões e com o seu desenvolvimento e sua evolução. Espero poder ajudar sempre.

Um abraço.

 
Postado : 03/08/2014 6:17 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Falei limites na quantidade que se vai usar, e não no tamanho delas. (Não vão ser "Muitas" variaveis publicas)

Eu em mais de 10 anos de carreira nisso (que não é muito) nunca alcancei esse limite a que vc se refere,

, não quis dizer que existe limites no uso,
E sim que o numero de variáveis que o programador vai precisar definir como publicas vão ser muito poucas.

 
Postado : 03/08/2014 6:28 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

E sim que o numero de variáveis que o programador vai precisar definir como publicas vão ser muito poucas.

EXATO, agora estamos chegando num consenso. Sim, muito poucas e cada vez menos, até serem ou eliminadas por completo, ou restritas a um número mínimo devido a necessidade bem justificada !

Valeu Ed, essa última msg me deixou muito contente !

 
Postado : 03/08/2014 6:31 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Ola

No meus teste percebi que o Vba trata variáveis e de nomes iguais com escopo diferente como variáveis diferentes

Public ColunO() As Variant

Sub test1()
ColunO = Range("A1:ff20000")'uso de memoria sobe" claro né"
End Sub

Sub test2()
Dim ColunO(1) As Variant
MsgBox UBound(ColunO, 1)'    o valor é 1
End Sub

Sub test3()
MsgBox UBound(ColunO, 1)'   o valor é 20000
End Sub

talvez isso seja para evitar conflitos entre nomes de variáveis.

Teve até um teste estranho que dependendo da posição das macro no modulo o resultado mudava,
Tipo:
Se o Teste3 estivesse antes do Teste2 apresentava um resultado, se estivesse abaixo, apresentava outro.

Ps. Só consegui usar o Redim para limpar a memoria da Arrays, talvez pq elas sejam publicas.

Ps4. o Excel continuou a aumentar o consumo de memoria sem fazer nada, enquanto eu tirava um cochilo subiu de 82m para 101m
Será que é por causa do salvamento automático ?

Att.

 
Postado : 03/08/2014 7:34 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Quando coisas estranhas acontecem e eu consigo replicar, e eu tiver com um humor animal, eu monto vários esquemas para medição e tirar conclusões. Assim acabo conhecendo ainda melhor a ferramenta e ensino mta coisa interessante.
Monte esquemas que possamos testar também, assim aumenta sua amostragem com os nossos resultados, ou ainda, podemos corrigir e/ou dar nossos pitacos...
Fica a dica!

Marque o tópico como resolvido se achar que já está, ok?

 
Postado : 08/08/2014 6:04 pm
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Desculpe,
tinha até esquecido desse tópico

Fernando,
sobre limpar a memoria das arrays eu não consegui usar suas dicas, então no final de conjuntos de macros que passam as arrays umas paras as outras eu uso o Redim.

sobre escopo de variáveis nas macros pensei que já era de conhecimento comum
só achei estranho sopre o comportamento diferente dependendo da posição da macro no modulo,
mas isso parou de acontecer depois de trocar a posição 2 vezes para teste :|

att

 
Postado : 08/08/2014 10:42 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Se o comportamento em memória muda, monte um modelo específico e poste aqui, quem sabe trabalharemos juntos para resolver o problema!
*crie novo tópico...

 
Postado : 09/08/2014 1:19 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

Está tudo bem,
São apenas considerações de fatos que eu desconhecia

a minha planilha está funcionando normal e bem rápida
as macros quando acionadas nem dá para piscar e já executaram

att

 
Postado : 09/08/2014 3:01 am