我目前正在使用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写入和读取大量数据,并且我想监视这些操作的性能。
谢谢!
最佳答案
有趣的是,您不必从HDD加载大量数据。至少要加载和写入的数据量高度依赖于系统配置。文件系统参数的细微调整可能会极大地影响读取的数据量。
特别是在使用映射文件(最好选择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
更改为您的HDD。无法看到哪些写入实际上是由您的过程引起的。由于操作系统的结构,这是不可能的。它将来自不同进程的读取和写入混合并匹配到一个队列中,之后便无法说出是什么触发了写入或读取。
但是,如果您的计算机没有做任何特别的事情,则通常的写/读IOPS会很低,因为大多数事情都发生在缓存中。至少当您更改算法时,您会看到这些更改。