Visual Basic - Memoria Insuficiente

Life is soft - evento anual de software empresarial
   
Vista:

Memoria Insuficiente

Publicado por Angel (1 intervención) el 15/10/2014 20:14:03
Que tal, tengo un problema de memoria insuficiente, lo raro es que al abrir el task manager la aplicacion tiene de 1 a 5 mb utilizados.

Antes de poner un código si se veia que se hiba a 1172 MB y era donde marcaba la Memoria Insuficiente.

La apliacion basicamente hace esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
Public Class Form1
 
    Dim conexionSQL = "XXXXXX"
    Dim correos As Integer
    Private Declare Function GetTickCount Lib "kernel32" () As Integer
    'Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean
 
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
proceso()
End Sub
 
Private Sub proceso()
        Dim retraso As Integer
        Dim cnn As SqlConnection = Nothing
        Dim cmd As SqlCommand = Nothing
        Dim dtr As SqlDataReader = Nothing
        Dim campodevuelto As String
        Dim nombreArchivoViejo, extensionArchivo As String
        Dim posicionExtension As Integer
        Dim cambiarNombre As Boolean
 
        nombreArchivoViejo = ""
        extensionArchivo = ""
        posicionExtension = 0
        cambiarNombre = False
 
        'Ruta de la carpeta de las imagenes
        Dim Mi_directorio As DirectoryInfo = New DirectoryInfo("D:\RepositorioImagenes\Destino\Temporal\")
        cnn = New SqlConnection(conexionSQL)
        cnn.Open()
        cmd = New SqlCommand("delete from tmp", cnn)
        cmd.ExecuteNonQuery()
        cnn.Close()
        cnn.Dispose()
        'Para cada imagen buscar el nombre del archivo correspondiente
 
        For Each Mi_archivo As FileInfo In Mi_directorio.GetFiles()
 
            'cambiarNombre = False
            retraso = 8000 + GetTickCount
            nombreArchivoViejo = Mi_archivo.Name
            extensionArchivo = Mi_archivo.Extension
 
            'Obtener la posicion final del nombre
            posicionExtension = InStr(1, nombreArchivoViejo, extensionArchivo, CompareMethod.Text) - 1
            'nombreArchivoNuevo = Mi_archivo.Name 'tiene extension
 
            'Extraer nombre 
            nombreArchivoViejo = CObj(nombreArchivoViejo.Substring(0, posicionExtension)) 'sin extension
            'While retraso >= GetTickCount
            Application.DoEvents()
            Try
                'cnn = New SqlConnection(conexionSQL)
 
 
                'cmdtru = New SqlCommand("delete from tmp", cnn)
                'cmdtru.ExecuteNonQuery()
                cnn = New SqlConnection(conexionSQL)
                cnn.Open()
                cmd = New SqlCommand("select articulo from articulos where articulo =" + nombreArchivoViejo, cnn)
                dtr = cmd.ExecuteReader()
                If dtr.HasRows Then
                    dtr.Read()
                    campodevuelto = CObj(dtr.GetValue(0))
                    dtr.Close()
                    cmd = New SqlCommand("select Repositorio from articulos where articulo =" + campodevuelto, cnn)
                    dtr = cmd.ExecuteReader()
                    If dtr.HasRows Then
                        dtr.Read()
                        If IsDBNull(dtr.GetValue(0)) Then
                            'es nulo, quiere decir que no existe
                            dtr.Close()
                            cmd = New SqlCommand("UPDATE articulos set Repositorio = 1 where articulo = " + campodevuelto, cnn)
                            cmd.ExecuteNonQuery()
                            dtr.Close()
                            cmd = New SqlCommand("insert into tmp select * from articulos where articulo = " + campodevuelto, cnn)
                            cmd.ExecuteNonQuery()
                            dtr.Close()
                        End If
                        dtr.Close()
                    End If
                    'cmdup = New SqlCommand("UPDATE articulos set Repositorio = 1 where articulo = " + campodevuelto, cnn)
                    'cmdup.ExecuteNonQuery()
                    'Carga a Tiendas
                    ConvertirTienda(nombreArchivoViejo)
                    System.Threading.Thread.Sleep(2000)
                    'Carga a Alsuper en Casa
                    'ConvertirCasa(nombreArchivoViejo)
                Else
                    'MsgBox("No se encontro el articulo en la base de datos")
                End If
            Catch ex As Exception
                MsgBox(Err.Description)
            Finally
                If cnn IsNot Nothing AndAlso cnn.State <> ConnectionState.Closed Then
                    'cnn.Close()
                    'cnn.Dispose()
                    'cmd.Dispose()
                End If
            End Try
            cnn.Dispose()
            cmd.Dispose()
            cnn.Close()
            'End While
        Next
        dtr.Close()
        cmd = New SqlCommand("select count(1) from tmp", cnn)
        dtr = cmd.ExecuteReader()
        If dtr.HasRows Then
            dtr.Read()
            correos = Integer.Parse(dtr.GetValue(0))
            If correos > 0 Then
                'MsgBox("Hay " + dtr.GetValue(0).ToString + " imagenes nuevas")
                btnMail.Enabled = True
            Else
                'MsgBox("No hay imagenes nuevas")
            End If
            cnn.Close()
        End If
        'MsgBox("El proceso a finalizado", MsgBoxStyle.Information)
        Me.Close()
    End Sub
 
Public Sub ClearMemory()
 
        Try
            Dim Mem As Process
            Mem = Process.GetCurrentProcess()
            SetProcessWorkingSetSize(Mem.Handle, -1, -1)
        Catch ex As Exception
            'Control de errores
        End Try
    End Sub
 
Private Sub ConvertirTienda(Archivo As String)
        Dim imagen As New Bitmap(New Bitmap("D:\RepositorioImagenes\Destino\Temporal\" + Archivo + ".jpg"), 150, 150)
        imagen.Save("D:\RepositorioImagenes\Destino\Tiendas\" + Archivo + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
        ClearMemory()
        'Try
 
        'My.Computer.Network.UploadFile(Cargo a FTP")
        'Catch ex As Exception
        'MsgBox(Err.Description)
        'End Try
 
    End Sub

Basicamente lo que hace es que obtiene los archivos que estan en un directorio, toma el nombre, lo compara en un bd , hace un update y un insert, despues pasa a ConvertirTienda() y la pasa a resolucion 150x150 en eso la copia a una carpeta nueva y por ultimo lo sube a un FTP. He intendado poner hilos e inclusive el DoEvents() pero se sigue quedando sin memoria. Ahora que puse el CleanMemory, checo en el task manager y sigue con buena memoria pero sigue marcando el mensaje.

Si me pudieran ayudar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder