Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: z3nth10n en 24 Julio 2013, 17:35 PM

Título: Comprimir proceso en la RAM
Publicado por: z3nth10n en 24 Julio 2013, 17:35 PM
Hola buenas, quería saber si es posible ya que hice un programa que bueno añade contactos a Skype (y de por ahí me saqué una lista de más de 4000 contactos)

Agregue cosa de 2000 y cuando terminó de agregar gente, el proceso el exe pesaba cosa de 970 mb en la ram... Ya se que si comprimo el proceso, va a aumentar el rendimiento del procesador...

Hay alguna forma?

Un saludo.
Título: Re: Comprimir proceso en la RAM
Publicado por: Eleкtro en 24 Julio 2013, 18:11 PM
No entiendo como puedes hacerte llamar "programador" en todos los lenguajes orientados a objetos que dices saber, cuando nisiquiera entiendes los conceptos básicos.

-> ¿Que es un Object? (http://en.wikipedia.org/wiki/Object_%28computer_science%29)

-> New Operator (http://msdn.microsoft.com/en-us/library/77s47661.aspx)

-> Disposing Objects (http://msdn.microsoft.com/en-us/library/ee557362%28v=office.14%29.aspx)

Citarnew Allocates memory for an object or array of objects of type-name from the free store and returns a suitably typed, nonzero pointer to the object.



Si alojas memória para un objeto de Skype4com, luego tendrás que liberar la memória del objeto después de haber terminado su utilización... ¿NO TE PARECE?



Nunca le hablo a nadie en plan: "Todos nacemos sabiendo esto, lammer", porque no me gusta la gente que habla como si fuesen superiores a otros, y yo no soy ningún Pro,
Pero es que tu proclamas y alardeas de saber mucho y luego nada Ikillnukes, nada de nada, déjate el copy/paste y lee un libro.


PD: Esta pregunta me ha sacado de quizio, lo siento mucho por las mayúsculas (son libres de editar el mensaje, moderadores).
Título: Re: Comprimir proceso en la RAM
Publicado por: El Benjo en 24 Julio 2013, 21:35 PM
Bueno, no creo entender bien por qué los contactos de te ocupan tanto espacio en tu aplicación, pero no creo que los necesites todos en memoria, si este es el caso lo que deberías hacer es guardarlos en disco y cargarlos en memoria sólo cuando los necesites.

Editado: Electro, esa tampoco es manera de responderle a alguien que está pidiendo ayuda.
Título: Re: Comprimir proceso en la RAM
Publicado por: z3nth10n en 24 Julio 2013, 21:57 PM
Es que ya le he sacado muchas veces de quicio xD

No yo me refiero en el mismo proceso.. Es que por cada contacto que agrega se añaden como cosa de 500kbs de ram :-\

PD: Eso es lo que pregunto si se puede comprimir... Ya se que existen los disposes y todo eso, y que en bruto no se puede comprimir el proceso en sí, se puede siempre probar a quitar sub-procesos, pero como ya sabrás los sub-procesos que yo tengo no son mas que 2 for each, un regex y una función para agregar gente...
Título: Re: Comprimir proceso en la RAM
Publicado por: Eleкtro en 24 Julio 2013, 23:01 PM
@ElBenjo
Creeme si te digo que soy muy tolerante y me gusta proporcionarle ayuda a los demás,

Pero una cosa es pedir ayuda para salir de un apuro, o pedir ayuda con intención de aprender, y otra cosa muy distinta es que alguien diga que se considera programador desde hace medio año o así, cuando nisiquiera se ha leido los operadores y encima hace este tipo de preguntas tán básicas!, es que todo lo haces a base de copy&pastes! ya basta tio, ¿Quien puede aguantar estas preguntas?, yo no!.

Cita de: Ikillnukes en 24 Julio 2013, 21:57 PMNo yo me refiero en el mismo proceso.. Es que por cada contacto que agrega se añaden como cosa de 500kbs de ram :-\

Deberías leer los enlaces que te puse más arriba, leer sobre objetos en general, dejate de "comprimir proceso en ram" o "quitar subprocesos" y chorradas tremendas no tiene sentido nada de lo que estás diciendo, intenta entender LEYENDO y luego busca el fallo y arreglalo, libera el objeto!.

EDITO: no te vendria nada mal tampoco usar el analizador de código de VisualStudio.
Título: Re: Comprimir proceso en la RAM
Publicado por: z3nth10n en 24 Julio 2013, 23:07 PM
Hombre como quien dice año y medio... Tu ya sabes que me puse hace 3 días..

PD: Se puede liberar memoria mientras se hace el proceso sin que se cierre el form y todo eso?

PDS: Ara me leo el manual y salgo de dudas ;)

PDSS: Voy a salir un ratillo así que, puede que tarde algo más de lo esperado en contestar (Ya hasta mañana si eso xD)
Título: Re: Comprimir proceso en la RAM
Publicado por: kub0x en 24 Julio 2013, 23:34 PM
Ikillnukes, la mejor manera de no tener que "COMPRIMIR" (:lol) los datos en la RAM es escribir código funcional, el cual no provoque dichas fugas de memoria. Reutilización de Objetos, liberación de recursos. Vamos, un usar y tirar de toda la vida para que me entiendas :D

Aun así, podrías echarle un vistazo al Recolector de basura (Gargabe Colector), que es el encargado de liberar los objetos y recursos que tu aplicación no está utilizando. Es automático y trabaja en segundo plano, pero perfectamente lo puedes llamar desde tu aplicación, aunque yo lo considero una mala prática, ya que resta eficiencia y velocidad a la aplicación.

Saludos!
Título: Re: Comprimir proceso en la RAM
Publicado por: Eleкtro en 24 Julio 2013, 23:37 PM
...!!!

Llevas mucho, mucho tiempo programando en un lenguaje orientado a objetos sin saber que coj**** es un objeto, ¿Como es posible?, ahora te das cuenta que los copy&paste no te van a poder resolver todos tus problemas.

Cita de: Ikillnukes en 24 Julio 2013, 23:07 PMPD: Se puede liberar memoria mientras se hace el proceso sin que se cierre el form y todo eso?

A lo que llamas "proceso", indaga en esa subrutina, fíjate en lo que "abres" y en lo que "cierras" o lo que NO "cierras", eso es todo lo que necesitas saber.

Intenta entender como funcionan las cosas, no es necesario ser un experto, repito que yo no lo soy, pero todos podemos poner algo de nuestra parte para leer las definiciones, intentar entenderlas, y practicar códigos para aprender.

Saludos.
Título: Re: Comprimir proceso en la RAM
Publicado por: kub0x en 25 Julio 2013, 00:21 AM
Y recuerda: mas importante que la prática es la teoría, sino es una pérdida de tiempo. No pierdes nada por leer un par de definiciones e intentar asimilarlas para entender el mundo de la POO (programación orientada a objetos).

En este mundo documentarse antes de implementar es esencial. Picar código es lo último que se debe de hacer, primero se debe exponer el problema y hallar una solución a éste. Si algo me ha enseñado esta vida es que aunque tengas una idea cojonuda, nunca la debes plasmar sin documentarla correctamente, ya que pierdes el tiempo escribiendo código que podría ser mas eficiente.

Dale, ponte las gafas si tienes, y a leer un poquito jeje seguro que algún día dejarás de preguntar por estos lares y serás capaz de programar sin ayuda.

Saludos!
Título: Re: Comprimir proceso en la RAM
Publicado por: El Benjo en 25 Julio 2013, 06:47 AM
Pues dejando a un lado si sabes o no hacer las cosas, quiero preguntarte algo sobre este programa tuyo en particular.

La manera en que tu aplicación almacena los contactos es mediante objetos? (Es decir, por cada contacto que agrega se hace más grande un arreglo de objetos de alguna clase que creaste tú o una tercera persona)

O sólo se agrega la dirección del contacto como un nuevo indice en un arreglo de Cadenas?

Utilizas más de un arreglo de cualquiera de los tipos mencionados antes durante el proceso? Me refiero a si cargas los datos en algún arreglo temporal antes del definitivo.

Y por último, tu proceso para cargar los contactos utiliza recursividad en alguna parte?

Cualquiera de los motivos mencionados anteriormente me parece buen candidato para que tu aplicación use tanta memoria.

Ah, se me olvidaba: en las respuestas anteriores se hacía mención de que sólo copeas código y esas cosas ¿Cuanto de ese código de tu aplicación es tuyo?

Un saludo y espero que no necesites demasiado de nuestra ayuda para resolver este problema.
Título: Re: Comprimir proceso en la RAM
Publicado por: SγиtαxEяяoя en 25 Julio 2013, 07:41 AM
:huh: :huh: Hace un par de dias tube una pelea aqui en el foro, y ahora otra  :silbar: :silbar: la programacion nos esta volviendo locos  >:D

(http://i.imgur.com/HJmOUVU.png)
Título: Re: Comprimir proceso en la RAM
Publicado por: z3nth10n en 25 Julio 2013, 13:40 PM
El problema ya lo solucione y es que SkypeLib no tiene dispose para sus objetos.
Título: Re: Comprimir proceso en la RAM
Publicado por: 43H4FH44H45H4CH49H56H45H en 25 Julio 2013, 18:33 PM
Y cual fue la solución  :huh:
Claro, si es que la hiciste personalmente y no la copiaste de algun lado   :-X
Título: Re: Comprimir proceso en la RAM
Publicado por: z3nth10n en 25 Julio 2013, 22:35 PM
Aún no la he hecho, tengo pensado hacer que cada 200 contactos la app se renicie y libere la memoria acumulada y siga con el proceso. :P
Título: Re: Comprimir proceso en la RAM
Publicado por: Eleкtro en 26 Julio 2013, 01:22 AM
Cita de: Ikillnukes en 25 Julio 2013, 22:35 PMtengo pensado hacer que cada 200 contactos la app se renicie y libere la memoria acumulada y siga con el proceso. :P

. . .

Parece que lo que te digan no sirve para nada, déjate de chorradas de reiniciar procesos o comprimir kiwis en la RAM,
lee de nuevo el comentario de Kubox, porque como último recurso no necesitas más, lee acerca de la class "GC" (garbage collector) http://msdn.microsoft.com/en-us/library/system.gc%28v=vs.80%29.aspx

...Encima ayer te pasé un código por privado, por skype, incluso te di instrucciones, era un snippet, y era muy eficaz, ¿Lo has intentado usar?.

Saludos...
Título: Re: Comprimir proceso en la RAM
Publicado por: 43H4FH44H45H4CH49H56H45H en 26 Julio 2013, 04:09 AM
A preguntas tontas...

Cita de: Ikillnukes en 24 Julio 2013, 17:35 PMAgregue cosa de 2000 y cuando terminó de agregar gente, el proceso el exe pesaba cosa de 970 mb en la ram... Ya se que si comprimo el proceso, va a aumentar el rendimiento del procesador...

Hay alguna forma?

Respuestas tontas...

Cita de: Ikillnukes en 25 Julio 2013, 22:35 PM
Aún no la he hecho, tengo pensado hacer que cada 200 contactos la app se renicie y libere la memoria acumulada y siga con el proceso. :P

:rolleyes:
Título: Re: Re: Comprimir proceso en la RAM
Publicado por: raul338 en 26 Julio 2013, 05:31 AM
Dim a As Object
A =  New ....

.......
A.Dispose() ' siempre que se pueda
A = Nothing


Sent from my LG-E612g
Título: Re: Comprimir proceso en la RAM
Publicado por: X3R4CK3R en 26 Julio 2013, 07:22 AM
Cita de: Ikillnukes en 25 Julio 2013, 22:35 PM
Aún no la he hecho, tengo pensado hacer que cada 200 contactos la app se renicie y libere la memoria acumulada y siga con el proceso. :P

(http://facepalm.hu/picard.jpg)

A ver, si lo que quieres es hacer una aplicación/script que te haga lo que quieras, como chapuza va "bien", si realmente quieres ser buen programador, vas horriblementa mal encaminado. Vale que puedas ser programador novel (no lo sé), pero realmente no es difícil optimizar lo que quieres, solo tienes que liberar la memoria que utilizas, almacenar los contactos de forma tempornal, suponiendo que los lees de un archivo y lo importas con la API de Skype, que tampoco ha quedado muy claro qué hace tu código...
Debes saber que los tipos de variables se destruyen (y por lo tanto, liberan memoria) al cerrar el bracket (o llave ({ y })) donde se declara, a diferencia de los punteros, que son construidos con el operador new y destruídos con delete, no es nada difícil, solo tienes que dar el paso, estudiarlo y dominarlo.

Un saludo
Título: Re: Comprimir proceso en la RAM
Publicado por: z3nth10n en 26 Julio 2013, 13:33 PM
Claro, mirad:

Código (vbnet) [Seleccionar]
Imports SKYPE4COMLib
Imports System.IO

Public Class frmMain

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


        'Dim pUser As SKYPE4COMLib.User
        Dim total As Integer = ListBox1.Items.Count

        Dim startingPosition As Integer = 0
        If File.Exists(".\contactos-temp.txt") Then
            Using sr As New StreamReader(".\contactos-temp.txt")
                sr.Read()
                startingPosition = Convert.ToInt32(sr.ReadToEnd)
                sr.Close()
            End Using
        End If

        Dim contactos As Integer
        Dim CurrentPosition As Integer = 0
        If contactos < 200 And startingPosition < ListBox1.Items.Count Then
            For x As Integer = startingPosition To ListBox1.Items.Count - 1
                Dim oUser As SKYPE4COMLib.User = CType(ListBox1.Items(x), SKYPE4COMLib.User)
                Dim pUser As SKYPE4COMLib.User
                pUser = oSkype.User(oUser)
                pUser.BuddyStatus = SKYPE4COMLib.TBuddyStatus.budPendingAuthorization
                oSkype.Friends.Add(pUser)
                contactos += 1
                pUser = Nothing
                CurrentPosition = x
            Next
        Else
            Using sw As New StreamWriter(".\contactos-temp.txt")
                sw.Write(CurrentPosition)
                sw.Close()
            End Using
            Process.Start(".\Agregueitor_6000.exe")
        End If

        cambio = contactos * 100 / total

        ProgressBar1.Value = cambio

    End Sub


Un saludo. ;)
Título: Re: Comprimir proceso en la RAM
Publicado por: El Benjo en 26 Julio 2013, 20:28 PM
Así sin probar el código me arriesgo a decirte que creo que tu problema se soluciona si dejas así esta parte del código:

Código (vbnet) [Seleccionar]

Dim contactos As Integer
        Dim CurrentPosition As Integer = 0
        If contactos < 200 And startingPosition < ListBox1.Items.Count Then
            Dim oUser As new SKYPE4COMLib.User
            Dim pUser As SKYPE4COMLib.User
            For x As Integer = startingPosition To ListBox1.Items.Count - 1
                oUser = CType(ListBox1.Items(x), SKYPE4COMLib.User)
                pUser = oSkype.User(oUser)
                pUser.BuddyStatus = SKYPE4COMLib.TBuddyStatus.budPendingAuthorization
                oSkype.Friends.Add(pUser)
                contactos += 1
                pUser = Nothing
                CurrentPosition = x
            Next
        Else
            Using sw As New StreamWriter(".\contactos-temp.txt")
...


Inténtalo, la verdad es que no he trabajado con la API de Skype pero creo que tu problema claramente es la creación de tantas variables con ese FOR. Intenta cargar todos los usuarios con esta modificación, así como lo hacías al principio.

Ya nos dirás cómo te fue. Saludos.
Título: Re: Comprimir proceso en la RAM
Publicado por: kub0x en 27 Julio 2013, 03:29 AM
@El Benjo: Lo que comentas no es nada más ni nada menos que la reutilización de variables. La misma variable va tomando distintos valores, en este caso objetos, por cada iteracción del bucle For.

Otra opción sería la de liberar el contenido de las variables de la siguiente manera:

Código (VB.NET) [Seleccionar]

...
                   oUser = Nothing
                   pUser = Nothing
...
     


De esta forma le estás indicando al GC que libere el contenido de dicha variable. GC = Garbage Collector.

Saludos!
Título: Re: Comprimir proceso en la RAM
Publicado por: El Benjo en 27 Julio 2013, 09:10 AM
Pero cada cuanto tiempo se libera la memoria del GC, porque hay que recordar que el GC no limpia la memoria cada que hacemos "Variable = Nothing".

Según sé, lo hace apróximadamente cada tres segundos. Imagínate que continúa con su código como está y simplemente hace

Código (vbnet) [Seleccionar]

oUser = Nothing
pUser = Nothing


y lo hace tan rápido que supera al GC. Pues va pasar que por un momento, aunque sea breve, va seguir ocupando los mismos 900 Mb de memoria. Ahora eso se resuelve forzando al GC a que limpie la memoria después de cada "Variable = Nothing", pero el código se vuelve lento y no es recomendable. Por eso que sugería la reutilización de variables.

Ikillnukes, intenta las tres formas y nos dices con cuál te fue mejor. Saludos.
Título: Re: Comprimir proceso en la RAM
Publicado por: kub0x en 27 Julio 2013, 12:37 PM
@ElBenjo: Exacto, no es una práctica recomendable setear las variables a Nothing. Particularmente prefiero la reutilización de variables o la implementación de IDisposable dentro del Objeto para después llamar a Dispose(). Como dije anteriormente el GC resta velocidad a la aplicación y por lo tanto eficiencia.

Estaría bien que Ikillnukes provase todas las opciones aquí mencionadas.

Saludos!
Título: Re: Comprimir proceso en la RAM
Publicado por: raul338 en 27 Julio 2013, 16:51 PM
Invoca al garbage collector a mano
Código (vb,7) [Seleccionar]
Dim a As Object
A =  New ....

.......
A.Dispose() ' siempre que se pueda
A = Nothing
GC.Collect()


Sent from my LG-E612g
Título: Re: Comprimir proceso en la RAM
Publicado por: kub0x en 27 Julio 2013, 17:01 PM
@raul338: Llamar al Garbage Collector se considera mala práctica, pues es el mismo quien se invoca automáticamente para liberar los recursos no utilizados tales como variables no utilizadas o sin referenciar (var = nothing). Si el Objeto implementa IDisposable, es decir, tiene por método Dispose(), pues has de llamarlo ya que es el destructor del objeto. Si hicieras ->
Código (Vb.NET) [Seleccionar]
Obj = Nothing lo que estás haciendo es quitar la referencia al objeto, pero no lo estás liberando, sigue en memoria, lo único que el Garbage Collector lo suprimirá cuando sea invocado, pero llamarlo en cada iteracción (como el ejemplo de Ikillnukes) sería una locura.

Saludos!