PowerShell随机文件生成器太慢了

时间:2015-04-07 21:26:21

标签: powershell random

尝试使用此PowerShell脚本在Windows中生成随机文件:

param([string]$path = "C:\temp", [int]$size = "1024", [long]$number= "1000")
Write-Host "Path: $path"
Write-Host "Size of file: $size"
Write-Host "Number of files: $number"

Write-Host "Started at:"
Get-Date -Format HH:mm:ss

md -Force $path |out-null

$script:StartTime = $(Get-Date)
for($i=0; $i -le $number - 1 ; $i++){
    [Byte[]]$out=@(); 0..($size-1) | %{$out += Get-Random -Minimum 0 -Maximum 255};
    [System.IO.File]::WriteAll("$path\$i.bin",$out)
    if (-Not ($i % 100) -and ($i -ne 0 )) {
        Write-Host "$i were created"
        $elapsedTime = $(Get-Date) - $script:StartTime
        $script:StartTime = $(Get-Date)
        Write-Host "$elapsedTime"
    }
}

当我想将文件大小从1KB增加到1MB时,即使是一个文件也需要很长时间,但我需要数千个文件。有没有办法解决这个瓶颈?

3 个答案:

答案 0 :(得分:0)

您可以关注评论中的示例并使用PowerShell执行所有操作,也可以使用file param fsutil.exe文件系统工具更有效地创建文件。

fsutil file createnew "d:\temp\1MOFile.txt" 1000000

答案 1 :(得分:0)

解决dd for windows

#default values

param([string]$path = "C:\temp", [int]$size = "1048576", [long]$number= "10000")
Write-Host "Path: $path"
Write-Host "Size of file: $size"
Write-Host "Number of files: $number"

##dd.exe should be in same dir
$path_to_dd = Get-Location 

Write-Host "Started at:"
Get-Date -Format HH:mm:ss

md -Force $path |out-null

$script:StartTime = $(Get-Date)

for($i=0; $i -le $number - 1 ; $i++){
    #genarate files
    (& $path_to_dd\dd.exe if=/dev/random of=$path\$i.bin bs=$size count=1) 2>&1 | Out-Null
    #periodical report to stdout with timestamp every 1k files
    if (-Not ($i % 1000) -and ($i -ne 0 )) {
        Write-Host "$i were created"
        $elapsedTime = $(Get-Date) - $script:StartTime
        $script:StartTime = $(Get-Date)
        Write-Host "$elapsedTime"
    }
}

Write-Host "Finished at:"
Get-Date -Format HH:mm:ss

答案 2 :(得分:0)

Function New-RandomFile {
    Param(
        $Path = '.', 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 
    (1..($FileSize/128)).foreach({-join ([guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-").SubString(1, 126) }) | set-content "$Path\$FileName"
}

这需要491毫秒来生成1mb文件。运行:

New-RandomFile -FileSize 1mb

更新:

我已更新我的函数以使用ScriptBlock,因此您可以将“NewGuid()”方法替换为您想要的任何内容。

在这种情况下,我制作1kb块,因为我知道我从不创建较小的文件。这大大提高了我的功能速度!

Set-Content强制结束NewLine,这就是每次写入文件时需要删除2个字符的原因。我用[io.file] :: WriteAllText()代替了它。

Function New-RandomFile_1kChunks {
    Param(
        $Path = (Resolve-Path '.').Path, 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 

    $Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }

    $Chunks = [math]::Ceiling($FileSize/1kb)

    [io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $Chunk.Invoke() }))")

    Write-Warning "New-RandomFile: $Path\$FileName"

}

如果您不在乎所有块都是随机的,您可以简单地调用()生成1kb块一次..这会大大提高速度,但不会使整个文件随机。

Function New-RandomFile_Fast {
    Param(
        $Path = (Resolve-Path '.').Path, 
        $FileSize = 1kb, 
        $FileName = [guid]::NewGuid().Guid + '.txt'
        ) 

    $Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
               [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }
    $Chunks = [math]::Ceiling($FileSize/1kb)
    $ChunkString = $Chunk.Invoke()

    [io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $ChunkString }))")

    Write-Warning "New-RandomFile: $Path\$FileName"

}

测量 - 命令所有这些更改以生成10mb文件:

执行New-RandomFile:35.7688241秒。

执行New-RandomFile_1kChunks:25.1463777秒。

执行New-RandomFile_Fast:1.1626236秒。

相关问题