Error con el manejo de variable de memoria que puede llegar a 99 MB

290 views
Skip to first unread message

alexana

unread,
Jul 24, 2023, 1:29:18 PM7/24/23
to Comunidad de Visual Foxpro en Español
De nuevo acudo en vuestra ayuda.

Resulta que recibo un mensaje que puede contener hasta 99 MB de tamaño y necesito manejarlo para dividirlo en bloques de 1MB, convertirlos a base64 y luego mandarlos, pero cuando digo de utilizar ese mensaje como variable de memoria me da el siguiente error:

There is not enough memory to complete this operation

He probado con incluir en el config.fpw las líneas:

MEMLIMIT = 80, 2048, 32768
MVCOUNT = 65000

Pero sigue dándome el error: bien al nombrar la variable de memoria, bien cuando llevo varios bloques enviados.

Alguien puede ayudarme?

Muchas gracias de antemano

Alexana

micky khan

unread,
Jul 25, 2023, 11:35:07 AM7/25/23
to publice...@googlegroups.com
CLEAR ALL
PUBLIC loMessage, lcMessage
lcMessage = "Contenido del mensaje muy largo..."  && Aquí colocarías tu mensaje completo
lnBlockSize = 1024  && Tamaño del bloque en bytes (1MB)

FOR lnPos = 1 TO LEN(lcMessage) STEP lnBlockSize
    loMessage = SUBSTR(lcMessage, lnPos, lnBlockSize)

    * En este punto, tienes un bloque de tamaño lnBlockSize que puedes convertir a base64 y enviar
   
    ? "Enviando bloque ", lnPos, " - ", lnPos + lnBlockSize - 1
ENDFOR

* Aquí completarías el código para enviar los bloques y manejar la respuesta del servidor



Mailtrack Remitente notificado con
Mailtrack
25/07/23, 10:30:08

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/f15bab33-9108-4a13-a1b2-40813b2f5e99n%40googlegroups.com.


--
  <_>
 (o o)
 (  °  )
<>-<>
Micky Khan

alexana

unread,
Jul 28, 2023, 5:19:11 AM7/28/23
to Comunidad de Visual Foxpro en Español
Gracias Micky por tu respuesta.

El problema está en que desde que declaro la variable de memoria me da el error de memoria insuficiente.

Ya probé en el config.fpw el incluir las líneas 
MEMLIMIT = 80, 2048, 32768
MVCOUNT = 65000
Y no dio resultado.

Hay alguna manera de decirle a foxpro que aumente la memoria para realizar esas operaciones. 

Alexana

HernanCano

unread,
Jul 28, 2023, 12:03:51 PM7/28/23
to Comunidad de Visual Foxpro en Español
¿Desde que declaras la vble?

Muestra cómo declaras la vble.....

micky khan

unread,
Jul 30, 2023, 9:50:27 PM7/30/23
to publice...@googlegroups.com
  1. Aumentar los valores de configuración en el archivo CONFIG.FPW: Ya has mencionado que intentaste aumentar los valores de MEMLIMIT y MVCOUNT en el archivo CONFIG.FPW, pero es posible que los valores que has utilizado no sean suficientes para tus necesidades. Puedes intentar aumentar aún más estos valores y probar si eso soluciona el problema. Por ejemplo, en lugar de "MEMLIMIT = 80, 2048, 32768", puedes probar con valores más altos como "MEMLIMIT = 80, 4096, 65536".

  2. Usar variables de memoria compartida (SHARED MEMORY): En lugar de declarar una variable de memoria local, puedes utilizar una variable de memoria compartida para almacenar datos grandes. Las variables de memoria compartida tienen un mayor límite de tamaño y pueden ayudar a evitar problemas de memoria insuficiente. Para declarar una variable de memoria compartida, utiliza el prefijo "SHARED" al declarar la variable. Por ejemplo, en lugar de "LOCAL cMiVariable", puedes usar "SHARED cMiVariable".

  3. Dividir el mensaje en bloques más pequeños: Si el mensaje que estás recibiendo es demasiado grande para manejarlo en una sola variable de memoria, considera dividirlo en bloques más pequeños y procesar cada bloque por separado. Esto puede ayudar a reducir la cantidad de memoria necesaria para procesar el mensaje.

  4. Optimizar el código: Revisa tu código para asegurarte de que estás utilizando la memoria de manera eficiente. Elimina variables innecesarias y libera la memoria que ya no se necesita.

  5. Considerar utilizar una base de datos: Si el tamaño del mensaje es demasiado grande para manejarlo en la memoria de Visual FoxPro, considera almacenar los datos en una base de datos en lugar de utilizar variables de memoria. Esto te permitirá manejar conjuntos de datos más grandes y evitar problemas de memoria.




Mailtrack Remitente notificado con
Mailtrack
30/07/23, 20:50:07

integral

unread,
Jul 31, 2023, 10:10:19 PM7/31/23
to Comunidad de Visual Foxpro en Español
Estimada Alexana

Buscando informacion encontre la siguiente informacion que quizas resuelva tu problema

intenta limpiando memoria cache y buffers antes del SELECT con estas intrucciones.

SYS(3050, 1, 512*1024*1024)
SYS(3050, 2, 512*1024*1024)

http://www.berezniker.com/content/pages/visual-foxpro/not-enough-memory-file-map-error-1150

Saludos.

Walter Valle

unread,
Aug 1, 2023, 12:13:48 PM8/1/23
to Comunidad de Visual Foxpro en Español
Hola, 

Esta función la puedes correr antes de tu proceso:

PROCEDURE _ReduceMemory
DECLARE INTEGER SetProcessWorkingSetSize IN kernel32 AS SetProcessWorkingSetSize INTEGER hProcess, INTEGER dwMinimumWorkingSetSize, INTEGER dwMaximumWorkingSetSize
DECLARE INTEGER GetCurrentProcess IN kernel32 AS GetCurrentProcess
LOCAL nProceso
nProceso = GetCurrentProcess()
SetProcessWorkingSetSize(nProceso,-1,-1)
CLEAR DLLS SetProcessWorkingSetSize, GetCurrentProcess

Germán Fabricio Valdez

unread,
Aug 1, 2023, 9:19:36 PM8/1/23
to Comunidad de Visual Foxpro en Español
hola alexa, vfp9 sollo maneja cadena de caracteres en variables shasta un maximo de 16 Megas.
Vfp10 32 o 64 bits soporta por defecto 64 megas,  pero tiene un nuevo sys de configuracion donde le podes poner que manejen lo que vos quieras

Germán Fabricio Valdez

unread,
Aug 1, 2023, 9:33:50 PM8/1/23
to Comunidad de Visual Foxpro en Español
 SYS(9059) es la funcion para setear el valor que deseas el maximo es  256MegasByte
Reply all
Reply to author
Forward
0 new messages