Board logo

标题: [效率算法] filemove占用cpu过高问题 [打印本页]

作者: aryce    时间: 2017-1-10 18:45     标题: filemove占用cpu过高问题

我先获取文件列表,然后for循环 filemove 把文件一个一个移动到另一个路径下。 我发现单个文件超过700M 上G 的时候。程序就会(无响应)CPU占用到100. 一直到这个文件移动完成,  开始下一个的时候,又活过来。
作者: austere    时间: 2017-1-10 19:30

这个算不上算法吧?  folemove和你本地复制文件差不多,难道你实际操作的时候cpu占用不高?
个人觉得这个是机器配置问题
作者: aryce    时间: 7 天前 09:12

回复 2# austere


    配置应该没问题 是在服务器上用的e5的cpu,应该和系统的复制不一样,我试试调用系统shell会不会占用没那么高
作者: austere    时间: 7 天前 22:57

上代码看下吧……  光描述看不出问题来
作者: aryce    时间: 6 天前 01:07

回复 4# austere
  1.                         For $i = 1 To $FileList[0]
  2.                                 For $s = 1 To $UpList[0]
  3.                                         Dim $UpList2 = _Menu($UpList[$s])
  4.                                         If _ArraySearch($UpList2,$FileList[$i]) <> -1 Then
  5.                                                 Dim $FileList2 = _Menu($File_Dir & "\" & $FileList[$i])
  6.                                                 For $n = 1 To $FileList2[0]
  7.                                                         _GUICtrlEdit_AppendText($Edit,  "移动 " & $FileList[$i] & " - "& $FileList2[$n])
  8.                                                         FileWrite($log,$FileList[$i] & "-"& $FileList2[$n])
  9.                                                         If FileMove($File_Dir & "\" & $FileList[$i] & "\" & $FileList2[$n],$UpList[$s] & "\" & $FileList[$i] & "\" & $FileList2[$n]) = 0 Then
  10.                                                                 _GUICtrlEdit_AppendText($Edit,  "  *未完成*" & @CRLF)
  11.                                                                 FileWrite($log,"  【未完成】" & @CRLF)
  12.                                                         Else
  13.                                                                 FileMove($File_Dir & "\" & $FileList[$i] & "\" & $FileList2[$n],$UpList[$s] & "\" & $FileList[$i] & "\" & $FileList2[$n])
  14.                                                                 Dim $sum = _Menu($UpList[$s] & "\" & $FileList[$i])
  15.                                                                 _GUICtrlEdit_AppendText($Edit,  " (总:" & $sum[0]  - 2 & ")" & @CRLF)
  16.                                                                 FileWrite($log," -> " & $UpList[$s] & "\" & $FileList[$i] & @CRLF)
  17.                                                                 $size2 = DirGetSize($File_Dir)
  18.                                                                 GUICtrlSetData($Progress1,StringFormat("%d",$size1 - $size2)/$size1*100)
  19.                                                         EndIf
  20.                                                 Next
  21.                                         EndIf
  22.                                         DirRemove($File_Dir &"\"& $FileList[$i])
  23.                                 Next
复制代码
代码有点复杂,这是一部分 , 卡的应该就是ELSE后面,  FileMove($File_Dir & "\" & $FileList[$i] & "\" & $FileList2[$n],$UpList[$s] & "\" & $FileList[$i] & "\" & $FileList2[$n]) 这一句,各种List[].是移动之前,对文件名和文件夹名字的处理,在另外的func里面完成的。  
其实就是个简单的 FileMove(“A”,“B”)而已。 意思就是用filemove 移动超过700M左右的文件,会卡死。对了,是有UI的。我写个简单点的 ,你试试吧。
  1. #include <ButtonConstants.au3>
  2. #include <EditConstants.au3>
  3. #include <GUIConstantsEx.au3>
  4. #include <WindowsConstants.au3>
  5. #include <GuiEdit.au3>
  6. #Region ### START Koda GUI section ### Form=
  7. $Form2 = GUICreate("窗体1", 238, 307, 314, 226)
  8. $Button1 = GUICtrlCreateButton("FileMove", 48, 24, 153, 57)
  9. $Group1 = GUICtrlCreateGroup("tips", 8, 112, 217, 185)
  10. $Edit1 = GUICtrlCreateEdit("", 16, 136, 201, 153, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_HSCROLL))
  11. GUICtrlSetData(-1, "Edit1")
  12. GUICtrlCreateGroup("", -99, -99, 1, 1)
  13. GUISetState(@SW_SHOW)
  14. #EndRegion ### END Koda GUI section ###

  15. While 1
  16.         $nMsg = GUIGetMsg()
  17.         Switch $nMsg
  18.                 Case $GUI_EVENT_CLOSE
  19.                         Exit
  20.                 Case $Button1
  21.                         _GUICtrlEdit_AppendText($Edit1,  "正在移动...")
  22.                         FileMove("d:\A.mp4","e:\A.mp4")
  23.                         _GUICtrlEdit_AppendText($Edit1,  "w完成")                       
  24.         EndSwitch
  25. WEnd
复制代码
把 A路径 换成一个上G 的大文件,至少7~800M 。试试
作者: jsdn2000    时间: 昨天 08:48

把A和B放在同一个盘符试一试。




欢迎光临 AUTOIT CN (http://autoitx.com/) Powered by Discuz! 7.2