he modificado su ejemplo como este:
with open(STAT_FILE, "r+b") as f:
m=mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
while True:
line=m.readline()
if line == '': break
print line.rstrip()
Sugerencias:
- no llaman una variable
map
, esta es una función incorporada.
- abra el archivo en
r+b
modo, como en el ejemplo de Python en la página de ayuda mmap
. Establece: En cualquier caso, debe proporcionar un descriptor de archivo para un archivo abierto para la actualización. Ver http://docs.python.org/library/mmap.html#mmap.mmap.
- es mejor no utilizar nombres de variables globales
UPPER_CASE_WITH_UNDERSCORES
, como se menciona en Nombres de variable globales en http://www.python.org/dev/peps/pep-0008. En otros lenguajes de programación (como C), las constantes a menudo se escriben en mayúsculas.
Espero que esto ayude.
EDIT: Hice algunas pruebas de tiempo en Linux porque el comentario me dio curiosidad. Aquí hay una comparación de los tiempos realizados en 5 ejecuciones secuenciales en un archivo de texto de 137 MB.
# normal file access.
real 2.410 2.414 2.428 2.478 2.490
sys 0.052 0.052 0.064 0.080 0.152
user 2.232 2.276 2.292 2.304 2.320
# mmap file access.
real 1.885 1.899 1.925 1.940 1.954
sys 0.088 0.108 0.108 0.116 0.120
user 1.696 1.732 1.736 1.744 1.752
Esos tiempos no incluyen el print
declaración (I excluido). Siguiendo estos números, diría que el acceso al archivo mapeado en memoria es bastante más rápido.
EDIT 2: Usandopython -m cProfile test.py
me dio los siguientes resultados:
5432833 2.273 0.000 2.273 0.000 {method 'readline' of 'file' objects}
5432833 1.451 0.000 1.451 0.000 {method 'readline' of 'mmap.mmap' objects}
Si no me equivoco entonces mmap
es un poco más rápido.
Además, parece que not len(line)
tiene un rendimiento inferior a line == ''
, al menos así es como interpreto la salida del generador de perfiles.
Como curiosidad, ¿cuál es la motivación para el uso de un archivo asignado en memoria para esto, en lugar de un archivo normal? – NPE
@aix: posiblemente podría tener GB de datos brutos, y me gustaría acceder a ellos en el método más eficiente posible. Pero la verdadera razón es: es más genial :) –
No sé si es más fresco, pero no debes simplemente asumir que es más rápido (si realmente te importa, deberías hacer un perfil). – NPE