Sobre consumo de RAM de una aplicacion

Iniciado por crazykenny, 4 Febrero 2012, 21:17 PM

0 Miembros y 1 Visitante están viendo este tema.

crazykenny

Hola; el caso es que, mientras estaba haciendo unas pruebas en un servidor tipo tienda "a lo cutre" en el que la gente puede hacerme pedidos de cartas de magic, yugioh, y world of warcraft añadiendole una serie de hipoteticos usuarios, pues he visto que el programa "falla" cuando le pongo la cantidad de 60000 usuarios (a decir verdad, un poco menos); entonces, como supuse que el consumo de memoria RAM no llegaba al 100%, o, mejor dicho, a menos del 100%, en el sentido de, por ejemplo, le ponia 40000 usuarios, y el consumo de RAM estaba sobre el 40% (con 1,1 GB de uso de RAM); en 50000 usuarios, sobre el 55% (con 1,3 GB de uso de RAM), y en 60000, el programa peta; cabe destacar que tengo 5GB de RAM, y aun me queda sobre los 2 GB de RAM, y me extraña que el programa, antes de llenar una determinada cantidad X de RAM se cuelgue, y la pregunta viene a ser a que se debe el hecho de que el programa que he hecho se cuelgue al añadirle tal cantidad de usuarios, si no es molestia, claro esta.
Gracias por vuestra atencion, y me disculpo por las molestias causadas.
Saludos.
A nivel personal, lo que me da mas miedo no son los planteamientos y acciones individuales, sino las realizadas en grupo, ya que estas ultimas pueden acabar con consecuencias especialmente nefastas para todos.
Se responsable, consecuente y da ejemplo.
http://informaticayotrostemas.blogspot.com.es/2013/12/situacion-de-la-educacion-actual-en.html
https://informaticayotrostemas.blogspot.com/

[Case]

Necesitamos mas datos, te recomiendo que postes el código fuente.

armizh

Aún sin saber datos, estoy seguro que el programa en cuestion esta almacenando los usuarios (y sus datos) en variables, matrices o arrays. ¿Como puedo estar tan seguro? a mi me pasa lo mismo cuando almaceno cadenas multimensionales tipo char[256][256], almaceno como máximo 32 de esta matriz. Supongo que el programa lo creaste tu (ya que esta posteado en la sección de programación general) y te recomiendo que uses alguna base de datos en vez de almacenarlos en alguna variable de cualquier tipo (llamece array, matriz, estructura, etc).
Saludos.
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

crazykenny

Bueno, case, el codigo es esl siguiente:

Graphics 1024,768,32,2
Cls
Locate 0,0
Print "Inserte la contraseña de administrador:"
Print "(No inserte nada para salir)"
pass$=Input()
Cls
Locate 0,0
If pass$=""
End
EndIf
users#=-1
general$=CurrentDir()+"general\"
pedidos$=CurrentDir()+"pedidos\"
gasto_usuarios$=CurrentDir()+"gastos\"
dat_users$=CurrentDir()+"datos_usuarios\"
If FileType(dat_users$)=0
CreateDir dat_users$
EndIf
info_users$=dat_users$+"archivo de usuarios.dat"
.actualizar_users
If FileType(pedidos$)=0
CreateDir pedidos$
EndIf
If FileType(info_users$)=1
fileout=ReadFloat(info_users$)
param_users#=ReadFloat(fielout)
If param_users#>0
Dim lista_param_users$(param_users#)
param_users#=param_users#-1
For tr#=0 To param_users#
dat$=ReadString(feout)
lista_param_users$(tr#)=dat$
Next
EndIf
users#=ReadFloat(fileout)
If users#>0
users#=users#-1
Dim gastado_users#(users#)
param_users#=param_users#-1
Dim listado_users$(users#,1)
Dim compras_users#(users#,productos#,2)
Dim parametros_users$(users#,param_users#)
For tr#=0 To users#
dat$=listado_users$(tr#,0)
dat_b$=info_users$+dat$+".dat"
If FileType(dat_b$)=1
fileout=ReadFile(dat_b$)
For trr#=0 To param_users#
dat_c$=ReadString(fileout)
parametros_users$(tr#,trr#)=dat_c$
Next
CloseFile(fileout)
EndIf
dat_b$=dat_users$+dat$+".dat"
If FileType(dat_b$)=1
fileout=ReadFile(dat_b$)
opciones#=ReadFloat(fileout)
gastado_users#(tr#)=opciones#
CloseFile(fileout)
EndIf
dat_b$=pedidos$+dat$+".dat"
If FileType(dat_b$)=1
fileout=ReadFile(dat_b$)
For trx#=0 To productos#
For t=0 To 2
opciones#=ReadFloat(fileout)
compras_users#(tr#,trx#,t)=opciones#
Next
Next
CloseFile(fileout)
EndIf
Next
EndIf
EndIf
.actualizar_productos
If FileType(general$)=0
Cls
Locate 0,0
Print "Se ha producido un error; no existe una carpeta con"
Print "los datos basicos de las categorias, subcategorias y"
Print "productos."
Print "Pulse una tecla para salir del programa."
WaitKey()
End
EndIf
general_b$=general$+"categorias_y_productos.dat"
dispo$=general$+"disponibilidad.dat"
If FileType(general_b$)=0
Cls
Locate 0,0
Print "Se ha producido un error; no existe un archivo con"
Print "los datos basicos de las categorias, subcategorias y"
Print "productos."
Print "Pulse una tecla para salir del programa."
WaitKey()
End
EndIf
If FileType(dispo$)=0
Cls
Locate 0,0
Print "Se ha producido un error; no existe un archivo con"
Print "los datos de disponibilidad de los productos."
Print "Pulse una tecla para salir del programa."
WaitKey()
End
EndIf
general_b$=general$+"categorias_y_productos.dat"
dispo$=general$+"disponibilidad.dat"
If FileType(general_b$)=1
fileout=ReadFile(general_b$)
dat$=ReadString(fileout)
dat$=ReadString(fileout)
categorias#=ReadFloat(fileout)
If categorias#>0
categorias#=categorias#-1
Dim lista_categorias$(categorias#)
For tr#=0 To categorias#
dat$=ReadString(fileout)
lista_categorias$(tr#)=dat$
Next
EndIf
subcategorias#=ReadFloat(fileout)
If subcategorias#>0
subcategorias#=subcategorias#-1
Dim lista_subcategorias$(subcategorias#,1)
For tr#=0 To subcategorias#
For t=0 To 1
dat$=ReadString(fileout)
lista_subcategorias$(tr#,t)=dat$
Next
Next
EndIf
productos#=ReadFloat(fileout)
If productos#>0
productos#=productos#-1
Dim lista_productos$(productos#,4)
For tr#=0 To productos#
For t=0 To 4
dat$=ReadString(fileout)
lista_productos$(tr#,t)=dat$
Next
Next
productos#=productos#+1
EndIf
beneficios#=ReadFloat(fileout)
Dim ben_adic$(beneficios#)
If productos#>0
productos#=productos#-1
fileout=ReadFile(dispo$)
Dim dispo_prod#(productos#)
For tr#=0 To productos#
opciones#=ReadFloat(fileout)
dispo_prod#(tr#)=opciones#
Next
CloseFile(fileout)
EndIf
EndIf
If x=1
x=0
Print "Datos de productos de tienda actualizados."
Goto recibir_signal
EndIf
svrgame=CreateTCPServer(8080)
If svrgame=0
Print "No ha sido posible crear el servidor de tienda."
Print "Pulse una tecla para salir del programa."
WaitKey()
End
EndIf
x=0
While Not KeyHit(1)
.recibir_signal
strstream=AcceptTCPStream(svrgame)
If strstream=0
Goto recibir_signal
EndIf
ip$=TCPStreamIP(strstream)
daty$=ReadString(strstream)
y#=0
.porty
y#=y#+1
opciones#=Left$(daty$,y#)
If opciones#=opciones_b#
puerto_envio#=opciones#
puerto_envio_b$=Left$(daty$,y#)
Goto comprovacional
EndIf
opciones_b#=Left$(daty$,y#)
Goto porty
.comprovacional
If Instr( daty$,"actualizardatos")>0
If daty$=puerto_envio_b$ + "0 " + "admin " + pass$ + " actualizardatos"
x=1
Print "Actualizando datos."
Goto actualizar_productos
EndIf
EndIf
If Instr( daty$,"actualizarusers")>0
If daty$=puerto_envio_b$ + "0 " + "admin " + pass$ + " actualizarusers"
x=1
Goto actualizar_users
EndIf
EndIf
If Instr( daty$,"precio")>0
For trr#=0 To productos#
datz$=puerto_envio_b$ + "0 " + trr# + " " + "precio"
If daty$=datz$
opciones#=lista_productos$(trr#,4)
tcp2=OpenTCPStream(ip$,puerto_envio#)
WriteFloat tcp2,opciones#
CloseTCPStream tcp2
EndIf
Next
EndIf
If Instr( daty$,"cantidad")>0
For trr#=0 To productos#
datz$=puerto_envio_b$ + "0 " + trr# + " " + "cantidad"
If daty$=datz$
xas#=0
xaso#=0
For ou#=0 To users#
For tc=0 To 1
xaso#=compras_users#(ou#,trr#,tc)
xas#=xas#+xaso#
Next
Next
dispos#=dispo_prod#(trr#)-xas#
tcp2=OpenTCPStream(ip$,puerto_envio#)
If tcp2<>0
Goto envio_00
EndIf
Goto recibir_signal
.envio_00
WriteFloat tcp2,dispos#
CloseTCPStream tcp2
EndIf
Next
EndIf
If users#=-1
Goto recibir_signal
EndIf
If Instr( daty$,"pedir")>0
For tr#=0 To users#
For trr#=0 To productos#
opciones_b#=dispo_prod#(trr#)
For trrr#=0 To opciones_b#
If daty$=puerto_envio_b$ + "0 " + listado_users$(tr#,0) + " " + listado_users$(tr#,1) + " " + trr# + " " + "pedir " + trrr#
xas#=0
xaso#=0
For ou#=0 To users#
For tc=0 To 1
xaso#=compras_users#(ou#,trr#,tc)
xas#=xas#+xaso#
Next
Next
dispos#=dispo_prod#(trr#)-xas#
If trrr#>dispos#
tcp2=OpenTCPStream(ip$,puerto_envio#)
If tcp2<>0
Goto envio_01
EndIf
Goto recibir_signal
.envio_01
WriteString tcp2,"fallo"
CloseTCPStream tcp2
Goto recibir_signal
EndIf
opy#=compras_users#(tr#,trr#,0)
compras_users#(tr#,trr#,0)=trrr#+opy#
tcp2=OpenTCPStream(ip$,puerto_envio#)
WriteString tcp2,"completo"
CloseTCPStream tcp2
dat$=listado_users$(tr#,0)
dat_b$=pedidos$+dat$+".dat"
fileout=WriteFile(dat_b$)
For trx#=0 To productos#
For t=0 To 2
opciones#=compras_users#(tr#,trx#,t)
WriteFloat(fileout,opciones#)
Next
Next
CloseFile(fileout)
EndIf
Next
Next
Next
EndIf
If Instr( daty$,"eliminar")>0
For tr#=0 To users#
For trr#=0 To productos#
opciones_b#=dispo_prod#(trr#)
opciones_b#=compras_users#(tr#,trr#,0)
For trx#=0 To opciones_b#
If daty$=puerto_envio_b$ + "0 " + listado_users$(tr#,0) + " " + listado_users$(tr#,1) + " " + trr# + " " + "eliminar " + trx#
opciones#=opciones_b#-trx#
tcp2=OpenTCPStream(ip$,puerto_envio#)
If tcp2<>0
Goto envio_02
EndIf
Goto recibir_signal
.envio_02
WriteString tcp2,"hecho"
CloseTCPStream tcp2
EndIf
Next
Next
Next
EndIf
Wend

Por otra parte, armizh, en lo de la base de datos de cualquier tipo, ¿como se hace?; me disculpo por mi ignorancia y demas, pero lo que se me ocurrio es, en vez de guardarlo todo en una matriz, es guardar todos los datos en archivos pequeños y luego acceder a ellos con los datos que me envian a traves de la red y demas; ¿es correcto?.
Saludos.
A nivel personal, lo que me da mas miedo no son los planteamientos y acciones individuales, sino las realizadas en grupo, ya que estas ultimas pueden acabar con consecuencias especialmente nefastas para todos.
Se responsable, consecuente y da ejemplo.
http://informaticayotrostemas.blogspot.com.es/2013/12/situacion-de-la-educacion-actual-en.html
https://informaticayotrostemas.blogspot.com/

armizh

Cita de: crazykenny en  5 Febrero 2012, 11:41 AM
Por otra parte, armizh, en lo de la base de datos de cualquier tipo, ¿como se hace?; me disculpo por mi ignorancia y demas, pero lo que se me ocurrio es, en vez de guardarlo todo en una matriz, es guardar todos los datos en archivos pequeños y luego acceder a ellos con los datos que me envian a traves de la red y demas; ¿es correcto?.
Saludos.
Pues so, eso podria funcionar, oero seria muy inseguro ya que se podria acceder facilmente desde cualquier computador. Sobre la base de datos, pues yo no se usarlas xd pero no debe ser dificil, algunas como MySQL tienen un gran numero de usuarios y una comunidad enorme, por lo que seria simplemente buscar en google o bing "usar mysql en <lenguaje de tu programa>"

Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

crazykenny

Gracias por el consejo y por tu ayuda, armizh.
Saludos.
A nivel personal, lo que me da mas miedo no son los planteamientos y acciones individuales, sino las realizadas en grupo, ya que estas ultimas pueden acabar con consecuencias especialmente nefastas para todos.
Se responsable, consecuente y da ejemplo.
http://informaticayotrostemas.blogspot.com.es/2013/12/situacion-de-la-educacion-actual-en.html
https://informaticayotrostemas.blogspot.com/

armizh

De nadas :) espero que te logres lo que deseas.
Saludos
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster