FoxPro/Visual FoxPro - manejo de cadenas

 
Vista:

manejo de cadenas

Publicado por ramon (47 intervenciones) el 10/09/2005 07:51:49
alguien podria decirme cual es la manera mas optima de recorrer una variable cadena caracter por caracter
porque
for i=1 to len(mystring)
mychar=substr(mystring,i,1)
......
endfor
es muy lento
les agradesco de antemano su ayuda
necesito procesar a veces cadenas de 1gb
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

RE:manejo de cadenas

Publicado por Roman Suazo (2723 intervenciones) el 10/09/2005 22:09:37
No se te puede ayudar mucho ya que no das todo el codigo, es decir, tu codigo lo puedes sustituir con un Mychar=Mystring y listo. La otra parte del codigo puede ser lo que en realidad te este haciendo la rutina lenta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por Roman Suazo (2723 intervenciones) el 10/09/2005 22:24:32
Bueno, analizando bien mi respuesta veo que lo de pasar los valores entre variables no se aplicaba. Lo siento. Aun asi seria bueno ver el resto de tu rutina o ver que es lo que quieres hacer ya que un giga ES BASTANTE (olvide leer estar parte). Asi que no me extraña que el proceso se demore. En todo caso si no hay mucho que se pueda hacer n fox entonces te recomendaria que usaras C o C++ y hacer esa parte de la rutina en esos lenguajes ya que estos son mucho mas rapidos en cuanto a la manipulacion de caracteres....

Si tuvieramos una mejor idea de lo que quieres hacer seria mas factible ayudarte con algunas ideas....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por ramon (47 intervenciones) el 11/09/2005 05:12:41
agradezco tu ayuda
lo que quiero es recorrer una cadena y procesar cada caracter de acuerdo a su valor y la unica instruccion en foxpro que encontre para recorrer una cadena caracter por caracter es substr() pero se me hace muy lenta , habra otra instruccion con la que pueda hacer lo mismo que con substr()

considera estas dos rutinas

procedure fscreatexto(pilentexto)
local i,lstexto
lstexto=''
for i=1 to pilentexto
lstexto=lstexto+'a'
endfor
return lstexto


procedure fvprocesatextov1(pstexto)
local i,mychar
for i=1 to len(pstexto)
mychar=substr(pstexto,i,1)
* aqui proceso cada caracter de la cadena pstexto
endfor


luego efectuamos
mytexto=fscreatexto(100000)
luego si ejecuto fvprocesatextov1(mytexto)
el proceso de esta ultima funcion dura aprox 2 seg en una maquina pentium 4 2.5G lo cual es muy lento
aparte cosa curiosa
si hago
mytexto2=fscreatexto(1000000) && 10 veces lo anterior
fvprocesatextov2(mytexto2) deberia llevarse 20 seg aprox , pero en realidad se lleva muchicimo mas
lo que me lleva a pensar que substr() no es una instruccion optimizada
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por Roman Suazo (2723 intervenciones) el 11/09/2005 22:26:38
Como te habia dicho antes, si no sabemos que significa *aqui proceso cada caracter de la cadena de Pstexto. Entonces no sabremos si en realidad lo que te demora es esa parte del codigo y no tanto el SUBSTR. Por ejemplo, checa la funcion ALINES el cual procesa lineas de texto, a lo mejor eso te ahorra revisar caracter por caracter y el proceso de analisis te lo hace mas rapido. Ojo, cuando trabajas con arreglos hay limitacion en cuanto al numero de celdas por arreglo. Lo mejor de esta funcion es que trabaja bien ya sea con campos memos o variables.

Estoy de acuerdo que pareciera que dos segundos es bastante, pero habria que hacer las comparaciones correspodnientes. Por ahi, en la internet es muy probable que encuentres ejemplos como los tuyos (como el primero) en donde se hacen comparaciones de rutinas entre lenguajes de bajo nivel (C) y de alto nivel (fox). Asi sabras si el tiempo que se esta tomando el fox no esta dentro de los parametros aceptables.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por ramon (47 intervenciones) el 12/09/2005 01:19:25
gracias roman, estoy investigando opciones
con respecto al codigo, para probar, ejecuto las rutinas tal cual, no hago nada en
el proceso de cada caracter, los dos segundos se los lleva solo en en recorrer la cadena asignando a mychar caracter por caracter
y lo que me doy cuenta es que los tiempos de recorrido de la cadena no crecen proporcional a la longitud de la cadena , sino que tarda mucho mas que proporcional
voy a probar con alines
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por Roman Suazo (2723 intervenciones) el 12/09/2005 02:42:47
Comono sabemos exactamente sobre tu app (solo que quieres manipular cadenas de caracteres). Posiblemente FILETOSTR( ) y STRTOFILE( ) te puedan ayudar si quieres pasar datos entre variables y archivos y viceversa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:manejo de cadenas

Publicado por ramon (47 intervenciones) el 14/09/2005 06:04:15
agradesco tu ayuda
efectivamente es mucho mas rapido ejectuar strtofile(...) y luego abrir el archivo creado con fopen y recorrer el archivo con fread(..,1) ademas se elimina el limitante de la longitud de las cadenas en vfp que creo es de 16000000 chars
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar