我目前正在使用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中读取大量数据,我希望监控这些操作的性能。
谢谢!
答案 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非常低,因为大多数事情都发生在缓存中。至少在更改算法时会看到更改。