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

2 投票
1 回答
2425 浏览
提问于 2025-04-18 13:08

我现在正在用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

正如你所看到的,我正在从硬盘上读取和写入大量数据,我想监控这些操作的性能。

谢谢!

1 个回答

1

有趣的是,你并不一定会从硬盘加载很多数据。你加载和写入的数据量其实很大程度上取决于你的系统配置。即使是文件系统参数的小调整,也可能会对读取的数据量产生很大的影响。

特别是使用内存映射文件(顺便说一下,这是个不错的选择),很多页面实际上是保存在内存中的。我试着找出有没有办法查看缓存未命中(硬盘页面进出),但操作系统对此保密得很好。

你可以尝试这样的做法:

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 改成你的硬盘名称。

不过,你无法看到哪些写入操作实际上是由你的进程引起的。这是因为操作系统的结构所限。它会把不同进程的读取和写入混合在一起,放进一个队列里,之后就无法判断是什么触发了某个写入或读取。

不过,如果你的电脑没有在做什么特别的事情,通常的写入/读取操作次数是非常低的,因为大部分操作都是在缓存中完成的。至少,当你改变算法时,你会看到一些变化。

撰写回答