实际地说,我在日常用的windows server 2019上单开了doc2docx_ver2.py脚本做本地处理,然后另开了一个task_server.py来做任务分发。然后本地直接使用windows自带的hyper-v功能装了7个虚拟机,每个虚拟机里跑着pywinauto_client.py来向宿主机接任务。每台节点有一个独立的32位的Office 2019,效率大概是宿主机1秒1个文件,虚拟机2秒一个文件。每台虚拟机配额是1核,4G内存(实际上3G就够了)并且打开动态内存开关。此外还在笔电本地开了一个节点,并且另外装了4个同样配置的虚拟机。
序
说一下这个分支都做了什么:由于doc是非开源格式,为了保证转换质量,这里采用python走pywin32调用Microsoft Office中的WORD来打开doc文件、另存为格式开源的docx的方式来进行转换。
经过探索,多进程地打开doc并且另存为docx并不能提高转换效率,直接多开WORD也不行,windows server的单(和多)用户多会话层面并行做也不行,怀疑是WINWORD.EXE它自己有一个大锁令打开和另存为这个操作变成串行。无奈,单机强行做并行只能考虑安装虚拟机。
由于WORD会弹出大量奇怪的拍脸弹窗阻塞整个进程,我先是引入超时机制来滤掉这些文件,但之后处理错误时发现文件太多(1.5w),人点不过来,于是引入pywinauto来做部分窗口的自动通过。
关于部署
实际地说,我在日常用的windows server 2019上单开了doc2docx_ver2.py脚本做本地处理,然后另开了一个task_server.py来做任务分发。然后本地直接使用windows自带的hyper-v功能装了7个虚拟机,每个虚拟机里跑着pywinauto_client.py来向宿主机接任务。每台节点有一个独立的32位的Office 2019,效率大概是宿主机1秒1个文件,虚拟机2秒一个文件。每台虚拟机配额是1核,4G内存(实际上3G就够了)并且打开动态内存开关。此外还在笔电本地开了一个节点,并且另外装了4个同样配置的虚拟机。
这些虚拟机最好部署在ramdisk或固态硬盘里,部署在固态中需要注意散热,有些固态过热会断开,导致数据火葬场。
脚本文件说明