1GB超えファイルを作成せよ~テスト用大容量ファイルの作り方~

Agaroot IT Partners(AITP)のtomoです。

とあるシステムのテストで1GB超えの、比較的大きなサイズのファイル(CSVと画像)を作成する必要がありました。
皆様もファイルアップロードテストなどの際、許容するファイルサイズより大きいものをアップロードしてみるテストなどを行う機会があるかと思います。

ということで、今回は大容量ファイルを作成する方法について紹介していきます。

この記事はこのような方におすすめ

  • テストに用いる大容量ファイルを作成したい方
  • 端末への言語やライブラリなどのインストールに対して規定が厳しく、なかなか許してもらえない中作業をされている方

要約

  • CSVファイルなどであればBashでも作成可能(新たな言語やライブラリなどをインストールする必要なし)
  • 画像はPythonとOpenCVのインストールが必要そう

ファイルの作成方法

今回は、以下のファイルを取り扱います。

  • ファイル形式不問(ただのダミーファイル)
  • CSVファイル
  • 画像ファイル

なお、端末に標準インストールされているであろうBashなどをなるべく用いて作成しようと思います。皆様の中には新たな言語やライブラリなどをインストールしたくなっても、規定が厳しかったりそもそもパブリックインターネットに端末が接続できない場合もあるでしょう。そのような状況下でも、画像以外のファイルはBashで用意できる方法を紹介します。

注意事項

今回私はMacを利用してBashコマンドを実行しました。LinuxやWindowsでは特にコマンドのオプション指定が異なる場合もあるかと思いますので、ご注意ください。

また、サイズの大きいファイルを作成する処理は端末などに大きな負荷を加えるものになりがちです。メモリ不足などはもちろん、CPUやGPUの逼迫などにも気をつけていただければと思います。

ファイル形式不問(ただのダミーファイル)

これが今回紹介する中で最も簡単なものです。コマンド1つで済みます。

$ dd if=/dev/zero of=1gb.dummy bs=1M count=1200

ddコマンドを用いたダミーファイルの作成については、下記ページにて紹介されています。本記事でも参考にさせていただきました。
https://www.itmedia.co.jp/help/tips/linux/l0606.html

CSVファイル

今回は話題のChatGPTでスクリプトの原型を作成した後少し手を加えました。

シェルスクリプトファイルを作成しましょう。
コードを読んでいただくと大体お分かりかと思いますが、基本的な考え方としては既存の行を複製していって行を増やそうと言うものです。

なお、本スクリプトはCSVファイルの内容が2行以上であることを想定しております。ヘッダー行はあってもなくても構いません。

#!/bin/bash
# 複製元ファイル名
file="data.csv"
# 現在のファイルサイズを取得(バイト単位)
file_size=$(stat -f%z "$file")
# 目標となるファイルサイズ
target_file_size=$((1024 ** 3 + 10000))
target_file_size=3000000
while (($file_size < $target_file_size)); do
    # 既存の行に追記されないよう、改行を追加しておく
    echo "\n" >> "$file"
    # ヘッダー行が存在することを想定して、1行目を複製せずにファイルをコピー
    # 一度に多くの行を追記すると端末への負荷が大きくなるので最大30万行に限定する
    sed -n '2,300001p;300002q' "$file" >> "$file"
    # 更新後のファイルサイズを取得
    file_size=$(stat -f%z "$file")
done
# 空行を削除した内容を一時ファイルに出力する
temp_file=temp_"$file"
grep -v '^$' "$file" > $temp_file
# 改行によって空行が生じることもあるので、空行を削除する
# (一時ファイルの内容で元々のファイルを上書き)
cp $temp_file $file
# 一時ファイルを削除
rm $temp_file
echo "処理が完了しました。"

画像ファイル

念の為前もってお断りさせていただきたいのですが、画像ファイルについては私の実行環境では1GBに後一歩のところで到達せず(約0.9GBまでしか到達できず)、大きすぎて画像ソフトなどでも表示できないので本当に「画像ファイル」になっているかどうかも定かでありません。
(完全な余談ではありますが、私が担当したテストでは「ファイル形式不問(ただのダミーファイル)」で記載した方法を用いて、拡張子が「.jpg」となっているファイルを作成することで対応しました)

画像ファイルの拡大処理となると、私が調べた限りでは流石に標準インストールされたものでは難しいようです。

Pythonと画像処理ライブラリであるOpenCVを用いれば1GB近くまでは到達できました。

今回は、下記ページを参考にしております。
https://di-acc2.com/programming/python/18853/
また、画像は下記ファイルをダウンロードしたので、よければお使いください。
https://pixabay.com/ja/photos/png-%E8%87%AA%E8%BB%A2%E8%BB%8A-%E3%82%AA%E3%83%BC%E3%83%8A%E3%83%A1%E3%83%B3%E3%83%88-2757379/

import cv2, os
# 読み込む画像を選択
img = cv2.imread("image_data.png")
# サイズ設定|cv2では(幅、高さ)の順で数値を設定
size = (12600,225800)
# リサイズ
img_resize = cv2.resize(
    img, # 画像データを指定
    size # リサイズ後のサイズを指定
)
cv2.imwrite('new_image_data.png', img_resize)
print(f"元のファイルサイズ:{os.path.getsize('image_data.png')}")
print(f"拡大後のファイルサイズ:{os.path.getsize('new_image_data.png')}")

まとめ

必要なサイズによっては、通常の編集ソフトでファイルを作成したりインターネットで探すだけではとても困難な場合もあるでしょう。

その点、標準インストールされているBashなどでCSVファイルなど比較的単純なファイルは作成可能ですし、Pythonなどを用いれば画像ファイルなども作成可能になりました。

大容量ファイルのご用意にお困りでしたら、ぜひ今回紹介した方法を参考にしてみてください。

関連するタグ