Windows 10:将数百万个小文件从一个目录移动到另一个目录的最快方法

Windows 10:将数百万个小文件从一个目录移动到另一个目录的最快方法

我有 16 个子目录,每个子目录包含 1m-1.5m 个文件(总共约 18m 个文件),但我需要将所有文件放在一个目录中。每个文件都是微小的(每个 35-100 字节)。这些文件的总大小相对较小——大约 600mb——但看起来其中的数量这导致了问题。

到目前为止我已经尝试过:

窗户移动:还没开始。据说需要“大约一天”才能计算移动。2小时后放弃了calculating

操作系统move:这对于前 500-600k 个文件(每秒移动大约 10k 个文件)效果很好,但当它拖向百万大关时,速度开始明显减慢,每 2 秒处理大约 100 个文件。

7Zip:我读过一些建议,说压缩整个文件夹然后将其提取到目标位置会更快;但是使用 GUI 几分钟后资源管理器就崩溃了;使用命令行非常慢(每隔几秒 100 个文件)

操作系统robocopy昨天已经移动了约 100 万个文件,我robocopy src_folder dest_folder *.log又跑去移动第一个目录中的最后一个文件。移动约 12000 个文件花了 27 分钟。

无论我选择哪种方法,似乎目标文件夹中的文件数是导致问题的原因。如果目标中的文件数量超过一百万个,则无论使用哪种方法,移动/复制速度都会变得非常缓慢。

有什么办法可以实现这个目标,而且不需要几天/几周的时间?作为参考,它位于一台机器上的单个 SSD 上:64 位、16GB RAM、8 个线程。

答案1

此 PowerShell脚本,经过许多积极响应的测试,调用速度Robocopy更快;只需更改几个参数[目的地等]就可以了:

$max_jobs = 10
$tstart = get-date
$log = "C:\Robo\Logs"

$src = Read-Host -Prompt 'Source path'
  if(! ($src.EndsWith("\") )){$src=$src + "\"}

$dest = Read-Host -Prompt 'Destination path'
  if(! ($dest.EndsWith("\") )){$dest=$dest + "\"}

if((Test-Path -Path $src ))
{
  if(!(Test-Path -Path $log )){New-Item -ItemType directory -Path $log}
  if((Test-Path -Path $dest)){
    robocopy $src $dest
    $files = ls $src

    $files | %{
      $ScriptBlock = {
        param($name, $src, $dest, $log)
        $log += "\$name-$(get-date -f yyyy-MM-dd-mm-ss).log"
        robocopy $src$name $dest$name /E /nfl /np /mt:16 /ndl > $log
        Write-Host $src$name " completed"
      }

      $j = Get-Job -State "Running"
      while ($j.count -ge $max_jobs) 
      {
       Start-Sleep -Milliseconds 500
       $j = Get-Job -State "Running"
      }
      Get-job -State "Completed" | Receive-job
      Remove-job -State "Completed"
      tart-Job $ScriptBlock -ArgumentList $_,$src,$dest,$log
    }

    While (Get-Job -State "Running") { Start-Sleep 2 }
    Remove-Job -State "Completed" 
    Get-Job | Write-host

    $tend = get-date

    Cls
    Echo 'Completed copy'
    Echo 'From: $src'
    Echo 'To: $Dest'
    new-timespan -start $tstart -end $tend

  } else {echo 'invalid Destination'}
} else {echo 'invalid Source'}

答案2

使用同步,因为它是免费的!它之所以对你来说是个不错的选择,是因为它不像 Windows 资源管理器那样在复制之前计算队列中每个文件的数量和大小。它只是直接复制。

但是您可以勾选复选框,这样它就会先计算磁盘空间。您还可以选择提前存储每个被删除或覆盖的文件的备份。并且您可以使用预览模式,这样您就可以在实际执行同步之前测试同步将如何进行。

还请记住,它并不总是按字母数字顺序复制文件,因此,如果复制或同步突然中途停止,对您造成损害,那么您可能必须从头开始。

我发现旧版本 2.30.1 比新版本(当时是 2.41.1)更易于使用且速度更快。

dsyncrhonize 2.30.1

dsynchronize 2.41.1

相关内容