2017-06-19 5 views
0

Je suis en train de lire un gros fichier de 30 Mo caractère par caractère. J'ai trouvé un article intéressant sur la façon de lire un gros fichier. Fast Method to Stream Big filesmmap en python impression données binaires au lieu du texte

Problème: Sortie d'impression des données binaires au lieu du texte lisible par l'homme réel

code:

def getRow(filepath): 
    offsets = get_offsets(filepath) 
    random.shuffle(offsets) 
    with gzip.open(filepath, "r+b") as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for position in offsets: 
      mm.seek(position) 
      record = mm.readline() 
      x = record.split(",") 
      yield x 


def get_offsets(input_filename): 
    offsets = [] 
    with open(input_filename, 'r+b') as f: 
     i = 0 
     mm = mmap.mmap(f.fileno(), 0, access = mmap.ACCESS_READ) 
     for record in iter(mm.readline, ''): 
      loc = mm.tell() 
      offsets.append(loc) 
      i += 1 
    return offsets 

for line in getRow("hello.dat.gz"): 
    print line 

Sortie: La sortie est produit des données binaires étranges.

['w\xc1\xd9S\xabP8xy\x8f\xd8\xae\xe3\xd8b&\xb6"\xbeZ\xf3P\xdc\x19&H\\@\x8e\x83\x0b\x81?R\xb0\xf2\xb5\xc1\x88rJ\ 

Est-ce que je fais quelque chose de terriblement stupide?

EDIT:

Je trouve le problème. C'est à cause de gzip.open. Je ne sais pas comment me débarrasser de cela. Des idées?

Répondre

1

Selon la documentation de GZipFile:

fileno(self)

Invoke the underlying file object's `fileno()` method. 

Vous cartographient une vue du fichier compressé .gz, pas une vue des données compressées.

mmap() ne peut fonctionner que sur les handles de fichiers du système d'exploitation, il ne peut pas mapper des objets de fichiers Python arbitraires. Donc, non, vous ne pouvez pas mapper de façon transparente une vue décompressée d'un fichier compressé à moins que cela ne soit pris en charge directement par le système d'exploitation sous-jacent.

+0

Merci de votre participation. J'essaie de modifier ma méthode en conséquence. – vkrams