我有 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)更易于使用且速度更快。