使用Python测量文件的原位读写速度
我现在正在用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
改成你的硬盘名称。
不过,你无法看到哪些写入操作实际上是由你的进程引起的。这是因为操作系统的结构所限。它会把不同进程的读取和写入混合在一起,放进一个队列里,之后就无法判断是什么触发了某个写入或读取。
不过,如果你的电脑没有在做什么特别的事情,通常的写入/读取操作次数是非常低的,因为大部分操作都是在缓存中完成的。至少,当你改变算法时,你会看到一些变化。