Foros del Web » Programación para mayores de 30 ;) » Programación General »

[SOLUCIONADO] Sustituir strings en un fichero de medio millon de lineas

Estas en el tema de Sustituir strings en un fichero de medio millon de lineas en el foro de Programación General en Foros del Web. Hola, Quisiera saber vuestra opinion sobre qué manera es la más rápida para sustituir determinadas cadenas, unas 80000, en un fichero de medio millon de ...
  #1 (permalink)  
Antiguo 20/02/2014, 01:11
 
Fecha de Ingreso: octubre-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Sustituir strings en un fichero de medio millon de lineas

Hola,
Quisiera saber vuestra opinion sobre qué manera es la más rápida para sustituir determinadas cadenas, unas 80000, en un fichero de medio millon de lineas.

Lo he hecho por bash, usando sed, y con python, usando replace, y ambas son muy lentas, entre 10 y 20h. ¿Hay alguna manera más rápida?

Muchas gracias,
  #2 (permalink)  
Antiguo 20/02/2014, 09:01
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 11 meses
Puntos: 35
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Fijate usando C a ver si cambia algo la velocidad, aunque la función replace de Python está implementada en C así que no vería mucha diferencia.
  #3 (permalink)  
Antiguo 20/02/2014, 09:07
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 6 meses
Puntos: 73
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Yo probaría con algún lenguaje compilado, por ejemplo C/C++ (Python, que yo sepa, es interpretado). La ganancia de velocidad de un lenguaje compilado frente a uno interpretado es elevada, por ejemplo, en la época de MS-DOS, la diferencia entre ejecutar un programa BASIC con el intérprete (GW-BASIC) y el mismo programa pero compilado era del orden de 10 a 1 por término medio. La pega podría ser que, en tu caso, hablamos de ficheros enormes, lo que requerirá frecuentes accesos a disco, y eso podría comerse una parte importante de la ventaja de velocidad de un lenguaje compilado frente a uno interpretado.

Saludos,
  #4 (permalink)  
Antiguo 20/02/2014, 11:13
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 9 meses
Puntos: 1329
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Python se hizo pensando en el procesamiento de texto es muy eficiente, y muchas de las funciones está implementadas en C. Tu problema me suena a tu algoritmo, quizá accedes al archivo en cada lectura y el acceso al IO es el que te da la lentitud.

Muestra lo que tienes (y si puedes sube un archivo de prueba).

Saludos
__________________
Grupo Telegram Docker en Español
  #5 (permalink)  
Antiguo 21/02/2014, 02:02
 
Fecha de Ingreso: octubre-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Muchas gracias por las respuestas.

Carlangueitor, en el script de python, primero vuelco todo el fichero a una variable;

Código:
f2 = open("myfile.txt",'r')
myText = f2.read()
Y después voy reemplazando siguiendo las variables que tengo almacenadas en un array de 80000 elementos:

Código:
for i in myList:
        myText = myText.replace(i,str(conta2))
        conta2+=1
Después copio la salida a un fichero.

El fichero sólo lo abro una vez. La salida la copio en uno nuevo, sólo una vez también.

En realidad el script en bash es bastante más rápido que el de python, aun así son unas 20h.

Saludos,
  #6 (permalink)  
Antiguo 21/02/2014, 02:44
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 11 meses
Puntos: 606
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Yo creo que es más optimo, o lo tendría que ser, trabajar con bloques de fichero y no volcar todo el fichero en memoria y trabajar ahí.
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 21/02/2014, 10:23
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 9 meses
Puntos: 1329
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Una lista de 80000 elementos quizá te de problemas de memoria quizá con Numpy podrías optimizar eso. Y en todo caso muestra todo el código, no es suficiente.


Saludos
__________________
Grupo Telegram Docker en Español
  #8 (permalink)  
Antiguo 23/02/2014, 20:32
 
Fecha de Ingreso: octubre-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Código:
myList=[]
conta=0
f = open('refTable', 'w')
for line in open("myInputFile"):
        if (line[2:8] == 'prefixOld'):
                myList.append(line[13:29])
                conta+=1
                f.write(line[13:29]+'\n')
                continue
        else:
             	if line[1:5] == 'finDeTabla':
                        break

f.close

f2 = open("myInputFile",'r')
myText = f2.read()
conta2=0
for i in myList:
        print str(conta2)
        myText = myText.replace(i,"prefixNew"+str(conta2))
        conta2+=1
f2.close()

fixeroOut = open("myOutputFile",'w')
fixeroOut.write(myText)
fixeroOut.close()

Primero repaso el fichero para almacenar los strings que quiero sustituir, los voy colocando en una lista. Son unas 80000 lineas/variables a almacenar. En esta primera lectura solo leo las primeras 80000 lineas del fichero, es como un encabezado donde cada linea es una variable. Cuando se acaba el encabezado, corto.
Despues vuelvo a abrir el fichero y empiezo a sustituir los strings.
Por ultimo guardo en un nuevo fichero.

@Malenko. ¿Te refieres a partir el fichero en varios y ir trabajando por bloques? Lo pensé pero no puede ser porque tengo que ir sustituyendo cada string por una nueva variable consecutiva, tipo var1 var2 var 3 var4, para no perder la referencia y poder volver a los strings originales por si hiciese falta.

Muchas gracias,

Última edición por anirvanao; 23/02/2014 a las 20:37
  #9 (permalink)  
Antiguo 25/02/2014, 21:10
 
Fecha de Ingreso: octubre-2008
Mensajes: 30
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Sustituir strings en un fichero de medio millon de lineas

Siguiendo la recomendacion de Malenko, lo he solucionado leyendo el fichero 'a bloques'.

Código:
#1MB
buffsize = 1048576
while true:
        buff = INPUT.read(buffsize)

        if len(buff) != buffsize:
                break
Ahora tarda unos 5 minutos.

Gracias!

Etiquetas: fichero, lineas, medio, strings, sustituir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:05.