Liberar memoria desde Visual Basic ¿Cómo?

TeKaNeO

Hola a todos:

Tengo un problema a raiz de un proceso que me consume toda la memoria y acaba cascando, me explico:

Estoy usando Microsoft Excel y su editor de VB para realizar macros. El proyecto es el siguiente:

cargo un fichero .xls que contiene una serie de filas y columnas ( 771 filas 4 columnas) y a raiz de una macro que he hecho con el editor de VB que este posee (la macro funciona correctamente), saco los datos de cada fila a un chart (grafico) y luego lo exporto a un fichero .gif.

Esto funciona correctamente, el problema viene que SOLO me hace 48 de las 771 filas que contiene el fichero .xls y claro... al llegar a la 49 me dice que "Memoria Insuficiente".

Mi duda es clara, ¿es posible que por ejemplo cada 10 procesos de salida a grafico-> export haga algun evento que libere la memoria? No se si esto es posible hacerlo en VB, por eso pregunto, se que en C si :(

Estoy en el ordenador del trabajo y estas son las caracteristicas por si sirve:

Pentium IV 3.40 Ghz 1024 RAM 250Gb HD y Windows 2000 como SO.

Un saludo a todos y gracias a quien pueda ayudarme :)

DaveTS

Yo la verdad es que ayudarte mucho no voy a poder, pq no me gusta el vb ni sus sucedaneos, lo que si que puedo decirte, es que estas haciendo algo mal. No es normal que te quedes sin memoria contando 700 registros..., vamos que me parece una salvajada, deberias repasar tu codigo.
O quizas buscando "excell memory leak" en google, encuentres a alguien que se haya topado con tu mismo problema.

editado:
Quizas esto te sirva, he encontrado un bug de Excell usando objetos ADO. El bug ocurre cuando haces la consulta y la hoja de calculo esta abierta (que en tu caso es necesario), en el problema esta la solucion.
http://support.microsoft.com/kb/319998

Espero que te sirva de algo.

cabron

Hasta donde yo sé, VB solo tiene liberación de memoria automática, no determinista.

A

Como anotación, aunque para el caso no sirva de nada, por poder, en VB se puede controlar la memoria de forma manual y crear punteros o listas enlazadas. Para ello habría que usar funciones de kernel32.dll en la API de windows, a través de GetProcessHeap() y HeapAlloc() y manejarlo todo vía RtlMoveMemory.

kas

Esta hablando de Visual Basic 6 para aplicaciones, que no es lo mismo que Visual Basic 6 a secas, por lo que, segun tengo entendido, ni apis ni liberaciones manuales de memoria.

Has provado la macro en otra maquina (a poder ser con mas ram)?

Mira en el administrador de tareas el consumo de cpu y de ram, a ver si es verdad que te consume tanto el excel con esa macro.

RiderBCN

usas algun Redim?

Soltrac

Te vas a matar con el xls y el VB xDD

de todas formas, no creo q te sirva de muxo, pero prueba con esta funcion

Private Sub NAR(ByRef o as Object)
Try
System.Runtime.Interopservices.Marshal.ReleaseComObject(o)
Catch
Finally
o = Nothing
End Try
End Sub

Ya simplemente vas limpiando los objetos
NAR(Wsheet)

y NAR lo q sea.

De todas maneras, como te dicen, VB tiene un recolector de basura automático, pero por si acaso, asi fuerzas eso :)

EDIT: La función es para Vb.NET, no se si las clases de VB son iguales o distintas :P

DaveTS

Si es que no os enterais xDD. Podriais leer el post para empezar y luego responder. NO usa Vb, usa el excell con su editor de macros.

r2d2rigo

#8, y que lenguaje usa el editor de macros de Excel? Bantú?

Y a ver si aprendes a leer tu, que el lo que ha dicho es, textualmente,

Estoy usando Microsoft Excel y su editor de VB para realizar macros. El proyecto es el siguiente:

DaveTS

es decir que me estas comparando el editor de excell con vb? xD, joder yo no sabia que era tan potente. Es un editor de scripts de vb, no un editor de vb puro y duro. Por lo tanto la mayoria de las funciones que estan posteando aqui, no funcionan.
Ademas, no se pq os emperrais si precisamente los de ms reconocen el bug y esta la solucion en mi respuesta.

ElRuso

Lo que usa Excel se llama VBA (Visual Basic for Applications) que no es 100% lo mismo que VB.

kas

Yo no se porque nadie me ha leido en #5....

Usuarios habituales

  • kas
  • ElRuso
  • DaveTS
  • r2d2rigo
  • RiderBCN
  • Archville
  • cabron