Memory Error
zako
ezako en yahoo.es
Mar Nov 16 22:31:18 CET 2004
On Tue, Nov 16, 2004 at 10:57:45PM +0100, amphora wrote:
> Hola a todos,
>
> Estoy haciendo una pequeña aplicación de análisis forense. El procedimiento a
> grandes rasgos es, tras obtener un listado recursivo de toda una partición,
> hacer un md5 de cada uno de los ficheros obtenidos y comparar esa suma con
> otra cargada en mysql, que contiene los hashes del proyecto nsrl (unos 29
> millones de hashes). Para el que no lo sepa lo que es nsrl
> http://www.nsrl.nist.gov/
>
> Bien el caso es que hasta donde yo sé para generar un md5 de un fichero hay
> que leerlo, y hay es donde me encuentro con el problema. Si un fichero es muy
> grande el programa provoca un error de memoria.
> Esto es lo que he sacado jugando con la consola de python, antes de
> codificarlo en serio:
>
> import md5
> from string import upper
> import fslist
>
> lista=[[],[]]
> print 'Obteniendo listado:'
> lista[0]=fslist.FSList('/home/amphora/Proyectos/*',recursive=True,file_only=True)
> print 'Obteniendo md5 de los ficheros'
> for fichero in lista[0]:
> try:
> fs=file(fichero)
> except:
> continue
> try:
> res=md5.new(fs.read()).hexdigest()
> except IOError:
> lista[1].append(None)
> continue
> lista[1].append(upper(res))
> fs.close()
> fs=file('/tmp/resultmd5.txt','w')
> try:
> for line in range(len(lista[0])):
> cadena='%s,%s\n' %(lista[0][line],lista[1][line])
> fs.writelines(cadena)
> except IndexError:
> pass
> fs.close()
Esta semana me he encontrado con el mismo problema en un programa que ando
implementando. Yo sólo consegui cargar hasta un fichero de 400MB para hacer el
hash ya que mi sistema tenia un 1GB de RAM. Para ficheros mayores empezaba un
uso exhaustivo de la swap del sistema y despues de 10 minutos de sistema sin
respuesta el kernel mataba el proceso Python.
He andado haciendo pruebas y lo he solventado leyendo el fichero linea por
linea en lugar de una vez del tiron xD. Así he podido calcular el hash de un
archivo de 1,3GB (ya no he calculado archivos mas grandes). Más o menos el
codigo era algo así:
m = md5.new()
fd = open('prueba', 'r')
tmp = fd.readline()
indice = 1
while tmp != '':
m.update(tmp)
tmp = fd.readline()
indice += 1
fd.close()
md5sum = m.hexdigest()
Sin embargo, este código hace un uso elevado de CPU y tarda algo más de tiempo
que un comando como md5sum tipico de los Unix. Tal vez en un futuro tenga que
hacer un porte de este módulo a un lenguaje de más bajo nivel. Saludos,
zako
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es