ho modificato il vostro esempio come questo:
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()
suggerimenti:
- non chiamare una variabile
map
, si tratta di una funzione built-in.
- apre il file in
r+b
modo, come nell'esempio Python nella pagina di guida mmap
. Si afferma: In entrambi i casi è necessario fornire un descrittore di file per un file aperto per l'aggiornamento. Vedi http://docs.python.org/library/mmap.html#mmap.mmap.
- è meglio non utilizzare i nomi delle variabili globali
UPPER_CASE_WITH_UNDERSCORES
, come indicato in Nomi variabili globali allo http://www.python.org/dev/peps/pep-0008. In altri linguaggi di programmazione (come C), le costanti sono spesso scritte tutte maiuscole.
Spero che questo aiuti.
EDIT: Ho eseguito alcuni test di temporizzazione su Linux perché il commento mi ha incuriosito. Ecco un confronto tra i tempi eseguiti su 5 esecuzioni sequenziali su un file di testo di 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
Quei tempi non comprendono il print
dichiarazione (esclusi esso). Seguendo questi numeri, direi che l'accesso ai file mappati in memoria è un po 'più veloce.
EDIT 2: Utilizzando python -m cProfile test.py
ho ottenuto i seguenti risultati:
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}
Se non mi sbaglio, allora mmap
è un po 'più veloce.
Inoltre, sembra che not len(line)
funzioni peggio di line == ''
, almeno è così che interpreto l'output del profiler.
Fuori di interesse, qual è la motivazione per l'utilizzo di un file memory-mapped per questo, al contrario di un normale file? – NPE
@aix: potrei avere GB di dati grezzi e mi piacerebbe accedervi nel modo più efficiente possibile. Ma la vera ragione è: è più figo :) –
Non so se è più bello, ma non dovresti semplicemente pensare che sia più veloce (se ti interessa davvero, dovresti profilare). – NPE