Powershellでランダムな文字列で埋め尽くされたダミーファイルを作る。

PoweShell コンピュータ
PowerShell

転送速度の確認などで指定サイズのダミーファイルが必要な場合があります。
そう言った場合、Windowsのコマンドプロンプトでfsutil file createnew パス サイズ(単位Byte)と実行すると指定サイズの0で埋め尽くされたダミーファイルが出来上がります。このコマンドは数GBファイルも一瞬で作成することが出来ます。

内容が0では都合が悪いケースもあり、ランダムな文字列のテキストファイルを作成するスクリプトを作ってみました。
動作は非常に遅いです。数MBぐらいならば一瞬ですが、1GBのファイルを作成するのに私のパソコンで1分ちょっとかかりました。実用的には難ありですが実行時間を計測することで、パソコンのベンチマークとして使えるかもしれません。

スクリプト

<#
.SYNOPSIS
指定サイズのランダムな文字列で埋め尽くされたテキストファイルを作成します。
<CommonParameters> はサポートしていません

.DESCRIPTION
遅いですので速度を求める方は別な方法を模索ください。
ランダムな文字列生成には[System.Web.Security.Membership]::GeneratePassword()を使っています。

.EXAMPLE
CreateRandomDummyFile.ps1 C:\test.txt 1073741824

.PARAMETER $TargetPath
ダミーファイルのパス
デフォルト:C:\test.txt

.PARAMETER $TargetSize
ダミーファイルのサイズ、単位:Byte
デフォルト:1MB

#>


param (
    $TargetPath = "c:\test.txt",
    $TargetSize = 1024*1024 # 1MB
)

$ErrorActionPreference = "STOP"

# アセンブリロード
Add-type -AssemblyName System.Web

    
$BuffSize = 128

$file = New-Object System.IO.StreamWriter($TargetPath, $false)
    
for($i=0; $i -lt $TargetSize; $i+=$BuffSize) {
    $ByteSize = $BuffSize
    if($TargetSize -lt ($i+$BuffSize)) {
        $ByteSize = ($TargetSize - $i)
    }

    $str = [System.Web.Security.Membership]::GeneratePassword($ByteSize, 1)
    $file.Write($str)
}

$file.Close()

結果


テキストエディタで折り返しをしていますが、実際は連続した1行の文字列です。

実行時間計測

1GBのファイルを作成する時間

Corei3-3120M

PS > Measure-Command { .\CreateRandomDummyFile.ps1 c:\test.txt 1073741824 }

Days              : 0
Hours             : 0
Minutes           : 1
Seconds           : 6
Milliseconds      : 875
Ticks             : 668751777
TotalDays         : 0.000774018260416667
TotalHours        : 0.01857643825
TotalMinutes      : 1.114586295
TotalSeconds      : 66.8751777
TotalMilliseconds : 66875.1777
プロセッサ
Core i3-3120M 2.5GHz 2コア4スレッド
メモリー
8GB
ストレージ
2.5インチHDD(システムドライブ)

Corei5-3320M

PS > Measure-Command { .\CreateRandomDummyFile.ps1 e:\test2.txt 1073741824 }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 37
Milliseconds      : 570
Ticks             : 375700706
TotalDays         : 0.000434838780092593
TotalHours        : 0.0104361307222222
TotalMinutes      : 0.626167843333333
TotalSeconds      : 37.5700706
TotalMilliseconds : 37570.0706
プロセッサ
Core i5-3320M 2.6GHz TB3.3GHz 2コア4スレッド
メモリー
8GB
ストレージ
mSATA-SSD(データドライブ)

Ryzen5 2600

PS > Measure-Command { .\CreateRandomDummyFile.ps1 .\test2.txt 1073741824 }


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 27
Milliseconds      : 155
Ticks             : 271550105
TotalDays         : 0.000314294103009259
TotalHours        : 0.00754305847222222
TotalMinutes      : 0.452583508333333
TotalSeconds      : 27.1550105
TotalMilliseconds : 27155.0105
プロセッサ
Ryzen5 2600 3.4GHz 6コア12スレッド
メモリー
64GB
ストレージ
MVNe-SSD(システムドライブ)

ストレージが足を引っ張らなければCPUのシングルコア性能がタイムに反映されているようです。

コメント