アラサーからのプログラマー生活

アラサーの新米PGが必死に頑張る成長記録です。あとは旅行とか。

PowerShellで大量のダミーデータを作る方法3種

こんばんは、堀井です。

IT業界に入って2年半経ちましたが、新しいことを1つ覚えるための前提知識として新しいこと10個が必要な業界だと知ることができました。

職業訓練校で学んでいた内容は実は基礎すら教えきれていなかったのかと感じています。



さて、今日はPowerShellで大量のダミーデータを作りたいよ、と言う人向けの記事です。

ダミーデータと言っても、そのデータに意味を持たせる必要がある時とない時でやり方が変わりますよね。

そんな人向けに当記事では

・データそのものに意味を持つダミーデータを作る方法

・データ容量に意味を持つダミーデータを作る方法

・データ圧縮率に意味を持つダミーデータを作る方法

の3種類に分けて紹介します。


データそのものに意味を持つダミーデータの作成

想定ケースとしては

・データベースに取り込めるフォーマットで、十万件・百万件のcsvファイルを作り高負荷テストをしたい

・特定の文字列が埋め込まれているファイルを作りたい

などです。

まずは以下のコードを書いてps1で保存してください。

for($i = 0; $i -lt 10; $i++){
    Get-Content .\moto.txt >> .\saki.txt
}

次にダミーデータの元を用意します。
最終行は[EOF]だけにしておいてくださいね。

f:id:hollage0214:20210602222016p:plain

追記先ファイルを用意します。

f:id:hollage0214:20210602222054p:plain

PowerShellで先ほど作ったコマンドを実行します。

f:id:hollage0214:20210602222114p:plain

できあがりです。

f:id:hollage0214:20210602222155p:plain

あとは"10"の部分を好きな回数に変えていただければいくらでもダミーデータが作れます。



ちなみに、コピー元ファイルの先頭2行だけをループさせたファイルを作りたい、と言った場合

for($i = 0; $i -lt 10; $i++){
	Get-Content .\moto.txt -Head 2 >> .\saki.txt
}

とすれば

f:id:hollage0214:20210602223046p:plain

このように1~2行目のデータだけ取得して追記することができます。



使用時の注意点を挙げるとすれば処理速度がマシンスペックに強く依存するところです。

私は以前単体テストで使うために2GB分のcsvファイルを作ろうとして、リモートサーバーを落としました。


データ容量に意味を持つダミーデータを作る方法

想定ケースとしては

・中身なんてどうでもいいからとにかく大容量のデータがほしい

・容量を閾値とした条件分岐するテストを行いたい

などです。

方法ですが、PowerShellで以下のコマンドを叩いてください。

fsutil file createnew dummy.dat (1024*1024)

f:id:hollage0214:20210602224438p:plain

デスクトップにできたdummy.datを確認すると確かに1MBのファイルができています。

f:id:hollage0214:20210602224509p:plain

中身を見てみるとこんな感じ。

本当に容量が大きいだけのファイルが作られます。

f:id:hollage0214:20210602224708p:plain

f:id:hollage0214:20210602224528p:plain

ちなみにこのファイルなのですが、実は圧縮率がめちゃくちゃに良いです。

なぜなら中身が全て同じ文字で埋まっているから。

f:id:hollage0214:20210602225120p:plain

f:id:hollage0214:20210602225124p:plain

約99.903%の圧縮率です。

これにはデビットハフマンも驚きを隠せません。



注意点として、コマンドプロンプトでも同様の方法でダミーデータを作ることはできますが、計算式が使えません

そのため面倒ですが1MBのファイルを作る場合は1048576と指定してやる必要があります。


データ圧縮率に意味を持つダミーデータを作る方法

先ほどは圧縮率の良いファイルの作成方法を紹介しましたが、そんなことはしないでほしい!!圧縮率は極限まで悪くあってほしい!!

と言う方にはこちらの方法。

私には使うケースがよく分かりません。

圧縮前のファイル容量が2GB未満で、圧縮後のファイル容量が1GB未満であれば通過するテストケースでエラーを出したい場合とか・・・??

方法ですが、PowerShellで以下のコマンドを叩いてください。

$random_bin = new-object byte[] (1024*1024*1024);
(new-object Random).NextBytes($random_bin);
[IO.File]::WriteAllBytes(".\Desktop\dummy.dat", $random_bin)

1GBのファイルが生成されます。

f:id:hollage0214:20210602230525p:plain

中身はこちら。

f:id:hollage0214:20210602231510p:plain

圧縮後の容量はこちら。

f:id:hollage0214:20210602230654p:plain

圧縮率が異常に悪いです。

なぜならランダムな値が入っているから。

圧縮前:1,073,741,824byte(ディスク上のサイズ)

圧縮後:1,047,069,504byte(ディスク上のサイズ)

圧縮率:約2.4841%

25.4MB分しか圧縮されませんでした。



ダミーデータの作り方自体はすぐに出てくるのですが、複数パターンを紹介している記事はほぼ見かけなかったので自分で書きました。

それではまた次回。