2014-09-09 6 views
0

J'ai un grand fichier (21 GByte) que je veux lire en mémoire et passer ensuite à un sous-programme qui traite les données de manière transparente pour moi. Je suis sur python 2.6.6 sur Centos 6.5 donc la mise à jour du système d'exploitation ou python n'est pas une option. Actuellement, j'utiliseQuel est le moyen le plus efficace pour lire un grand fichier binaire python

f = open(image_filename, "rb") 
image_file_contents=f.read() 
f.close() 
transparent_subroutine (image_file_contents) 

qui est lent (~ 15 minutes). Avant de commencer à lire le fichier, je sais quelle est la taille du fichier, car j'appelle os.stat (nom_fichier_image) .st_size

afin que je puisse pré-allouer de la mémoire si cela avait du sens.

Merci

+2

Utiliser 'de mmap'. https://docs.python.org/3/library/mmap.html –

+1

Un tampon plus grand peut aider 'open (image_filename, 'rb', 64 * 1024 * 1024)' – tdelaney

+0

Comment envisagez-vous d'accéder aux données? Accès aléatoire? Lire un bloc, processus, répéter? Ou avez-vous réellement besoin du fichier entier dans mappé en mémoire? – xavier

Répondre

0

Pour suivre la suggestion de Dietrich, je mesure cette technique mmap est 20% plus rapide que une grande lecture pour un fichier d'entrée de 1.7GB

from zlib import adler32 as compute_cc 

n_chunk = 1024**2 
crc = 0 
with open(fn) as f: 
    mm = mmap.mmap(f.fileno(), 0, prot = mmap.PROT_READ, flags = mmap.MAP_PRIVATE) 
    while True: 
    buf = mm.read(n_chunk) 
    if not buf: break 
    crc = compute_crc(buf, crc) 
return crc 
Questions connexes