2015-11-06 2 views
0

Je cours Python 2.7 sur une machine Linux, et de loin la partie la plus lente de mon script charge un grand fichier json à partir du disque (un SSD) en utilisant le ujson bibliothèque. Quand je vérifie top pendant ce processus de chargement, mon utilisation de processeur est fondamentalement à 100%, me menant à croire que je suis goulot d'étranglement en analysant le json plutôt qu'en transférant les octets du disque dans la mémoire. Est-ce une supposition valide à faire, ou va-t-il graver des boucles vides ou quelque chose en attendant le disque? Je suis curieux de savoir parce que je ne suis pas sûr que de consacrer un autre noyau de mon cpu à un autre script qui fait beaucoup d'E/S disque ralentira considérablement le premier script.diagnostiquer quand je suis limité par disque i/o

Répondre

1

Sans voir votre code, je vais supposer que vous faites quelque chose comme ceci:

with open('data.json') as datafile: 
    data = json.loads(datafile.read()) 

Au lieu de cela, vous pouvez diviser les étapes de la lecture du fichier et l'analyser:

with open('data.json') as datafile: 
    raw_data = datafile.read() 
    data = json.loads(raw_data) 

Si vous ajoutez des appels de synchronisation, vous pouvez déterminer la durée de chaque étape prend:

# Timing decorator from https://www.andreas-jung.com/contents/a-python-decorator-for-measuring-the-execution-time-of-methods 
import time             

def timeit(method): 

    def timed(*args, **kw): 
     ts = time.time() 
     result = method(*args, **kw) 
     te = time.time() 

     print '%r (%r, %r) %2.2f sec' % \ 
       (method.__name__, args, kw, te-ts) 
     return result 

    return timed 

with open('data.json') as datafile: 
    @timeit 
    raw_data = datafile.read() 
    @timeit 
    data = json.loads(raw_data) 
+0

oh wow qui était simple, dunno pourquoi je n'a pas pensé à ça – George