Диагностирование, когда я ограничен дисковым вводом / выводом

Я использую Python 2.7 на машине с Linux, и самая медленная часть моего скрипта - это загрузка большого файла json с диска (SSD) с использованием библиотеки ujson. Когда я проверяю top во время этого процесса загрузка моего процессора в основном составляет 100%, что наводит меня на мысль, что у меня узкое место при анализе json, а не при передаче байтов с диска в память. Это допустимое предположение, чтобы сделать, или ujson будет записывать пустые циклы или что-то в ожидании диска? Мне интересно знать, потому что я не уверен, что выделение другого ядра моего процессора для другого сценария, который выполняет много операций ввода-вывода на диске, значительно замедлит первый сценарий.

1 ответ

Решение

Не видя ваш код, я предполагаю, что вы делаете что-то вроде этого:

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

Вместо этого вы можете разделить шаги чтения и анализа файла:

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

Если вы добавите несколько вызовов времени, вы можете определить, сколько времени занимает каждый шаг:

# 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)
Другие вопросы по тегам