2011-02-26 10 views
7

Estoy tratando de averiguar cómo usar mmap con un archivo gzip comprimido. ¿Es eso posible?¿Pueden colaborar mmap y gzip?

 
import mmap 
import os 
import gzip 

filename = r'C:\temp\data.gz' 

file = gzip.open(filename, "rb+") 
size = os.path.getsize(filename) 

file = mmap.mmap(file.fileno(), size) 

print file.read(8) 

Los datos de salida están comprimidos.

+0

parece haber ninguna C++ o C#, ya que el ';' faltan en el extremo de la línea. ¿Tal vez Python o Ruby? –

+0

@uwe, esa sintaxis de importación y esas funciones de biblioteca es python – tobyodavies

+0

Gracias, @tobyodavies, he agregado la etiqueta. –

Respuesta

12

Bueno, no de la manera que desee.

mmap() se puede utilizar para acceder al archivo comprimido si los datos comprimidos son los que usted desea.

mmap() es una llamada al sistema para asignar bloques de disco a la RAM casi como si estuviera agregando swap.

No se puede asignar la información descomprimida a la memoria RAM con mmap() ya que no está en el disco.

12

Puedes hacerlo fácilmente. De hecho, el módulo gzip obtiene como argumento opcional un objeto similar a un archivo.

import mmap 
import gzip 

filename = "a.gz" 
handle = open(filename, "rb") 
mapped = mmap.mmap(handle.fileno(), 0, access=mmap.ACCESS_READ) 
gzfile = gzip.GzipFile(mode="r", fileobj=mapped) 

print gzfile.read() 

Lo mismo se aplica a tarfile módulo:

import sys 
import mmap 
import tarfile 

f = open(sys.argv[1], 'rb') 
fo = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) 
tf = tarfile.open(mode='r:gz', fileobj=fo) 

print tf.getnames()