使用python测量文件的原位读/写速度

时间:2014-07-13 13:17:12

标签: python performance monitor

我目前正在使用python来读取和写入大图像(使用OpenCV和numpy的memmap函数)。具体来说,我正在制作图像金字塔。

在python中,是否有可能监视文件的当前读写速度?即像移动平均值(MB /秒)。

我认为这不重要,但我的代码的主要部分是:

    for y in range(ysize):
        #Open a previously defined temp image file
        bigIMG = np.memmap('tempfile.bin', dtype='uint8', mode='r+', shape=(ysize,xsize,3))

        #Grap a chunk of the full image, save it, shrink it, 
        #and put it into the next lower level of the pyramid
        for x in range(xsize):
            chunk = bigIMG[y*block:(y+1)*block,x*block:(x+1)*block]
            cv2.imwrite('+str(x)+"_"+str(y)+".png",chunk)
            down = cv2.resize(chunk,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_LINEAR)
            smallerIMG[(y*block)/2:((y+1)*block)/2,(x*block)/2:((x+1)*block)/2] = down

        #Flush changes to HDD
        del smallerIMG

正如您所看到的,我正在写入并从HDD中读取大量数据,我希望监控这些操作的性能。

谢谢!

1 个答案:

答案 0 :(得分:1)

有趣的是,您不一定要从HDD加载大量数据。至少您正在加载和写入的数据量在很大程度上取决于您的系统配置。文件系统参数的微小调整可能会对读取的数据量产生巨大影响。

特别是对于memmapped(很棒的选择,BTW)文件,许多页面都保存在RAM中。我试图找出是否有任何方法可以看到缓存未命中(HDD页面输入/输出),但操作系统保密。

你可能想尝试这样的事情:

import psutil

iocnt1 = psutil.disk_io_counters(perdisk=True)['sda1']
# do  something IO intensive
iocnt2 = psutil.disk_io_counters(perdisk=True)['sda1']

print 'Blocks written {0}'.format(iocnt2.write_count - iocnt1.write_count)
print 'Blocks read {0}'.format(iocnt2.read_count - iocnt1.read_count)

当然,您必须安装psutil模块并将sda1更改为您的硬盘。

无法确定哪些写操作实际上是由您的进程引起的。由于操作系统的结构,这是不可能的。它将来自不同进程的读取和写入混合并匹配到队列中,之后无法说出触发写入或读取的内容。

但是,如果您的计算机没有做任何特殊的事情,那么通常的写入/读取IOPS非常低,因为大多数事情都发生在缓存中。至少在更改算法时会看到更改。