Python 运行时硬盘一直有写入

2018-07-24 12:33:39 +08:00
 cjq8z
现在在学习 Python,发现一件有件事不是太明白,我的 Python 程序在运行时一直有写硬盘的操作,又没有读取,我全部的操作在内存里完成,并没有涉及到文件读写,这个写硬盘来源在哪里?
Python 程序主要作用是截图并识别文字
用到三个:win32API、OpenCV 和 pytesseract
win32API 是用来截图,
OpenCV 是把截图转换成二值图
pytesseract 识别二值图,return 出识别结果。

在程序运行时,发现 win32 每次截图,win8.1 系统资源管理器都显示有 50kb/s 左右的写入操作,时间不到一秒。我对 win32API 截图操作以 200ms 间隔迭代了两万多次,发现硬盘一直在写入,速度大概在 53kb/s,但是在中间没有任何读取操作。

如果我的程序完整运行,在迭代过程中,发现资源管理器会显示硬盘写入速度在 170kb/s 左右。

不明白的,这个写入究竟写的是什么内容,我全部操作都在内存里完成,不涉及到写文件操作。
2283 次点击
所在节点    Python
5 条回复
laqow
2018-07-24 12:40:42 +08:00
跟图片有关的缓存都是写在 temp 里的可以自己翻源码
cjq8z
2018-07-24 12:41:28 +08:00
win32api 代码如下:
import win32gui
import win32ui
hwnd = win32gui.FindWindow(None, windowname)
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
#dataBitMap.SaveBitmapFile(cDC, bmpfilenamename)
我在这里就把 pycdc 转换成了 numpy,保存在变量里,在后面代码运行后,就 return 这个变量出去。
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
cjq8z
2018-07-24 12:47:34 +08:00
@laqow 非计算机专业,没有系统学过编程,对这些不是太明白。我用过 pillow 截图,这个要 50ms,速度不够快,win32API 只要 10ms,用 pillow 而这个也有写硬盘操作。像这种缓存,有没有办法避免它写,如果不想它写,该如何解决?
wwqgtxx
2018-07-24 13:10:43 +08:00
你去翻翻 pytesseract 的源码,有些使用他是调用 tesseract.exe 的,那样的话需要先把图片写入硬盘再让 exe 读取
cjq8z
2018-07-24 13:14:35 +08:00
@wwqgtxx 谢了老哥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/473638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX