当我被磁盘i / o限制时诊断

时间:2015-11-06 17:09:37

标签: python json linux performance ujson

我在Linux机器上运行Python 2.7,到目前为止,我的脚本中最慢的部分是使用ujson库从磁盘(SSD)加载大型json文件。当我在这个加载过程中检查top时,我的cpu使用率基本上是100%,这使我相信我通过解析json而不是通过将磁盘中的字节传输到内存中而受到瓶颈。这是一个有效的假设,还是ujson在等待磁盘时会烧掉空循环?我很有兴趣知道,因为我不确定是否将我的cpu的另一个核心用于另一个执行大量磁盘i / o的脚本会显着减慢第一个脚本。

1 个答案:

答案 0 :(得分: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)