公開データセットとか、やたらとファイル数が多い zip ファイルをノートブックで unzip
すると、出力が多すぎて UI のパフォーマンスが急激に劣化する。
!unzip /home/data/large_dataset.zip -d /home/data/
Archive: /home/data/large_dataset.zip
inflating: /home/data/large_dataset/1/1900_753325_0060.png
inflating: /home/data/large_dataset/1/1900_754949_0023.png
inflating: /home/data/large_dataset/1/1900_758495_0075.png
inflating: /home/data/large_dataset/1/1900_761460_0029.png
inflating: /home/data/large_dataset/1/1900_766994_0030.png
inflating: /home/data/large_dataset/1/1900_776319_0015.png
...
(More 80K lines)
かといって、 /dev/null
にリダイレクトしたり、-q
オプションを指定して出力そのものをなくしてしまうと、本当に解凍処理が進んでいるのか分からなくて不安になる。
!unzip /home/data/large_dataset.zip -d /home/data/ > /dev/null
!unzip -q /home/data/large_dataset.zip -d /home/data/
それ、pv
コマンドで出来るよ
ググってみると pv コマンドで出来る、とのことだったが、全体のファイル数を指定してちゃんとプログレス・バーが機能するようにしている例が見当たらなかったので、この記事を書いた。
n_files = !unzip -l /home/data/large_dataset.zip | grep .png | wc -l
!unzip -o /home/data/large_dataset.zip -d /home/data/ | pv -l -s {n_files[0]} > /dev/null
- まず、
unzip -l
で全体のファイル数を取得する。unzip -l
が報告する内容にはディレクトリも含まれているので、grep
でフィルタが必要だ。残念ながら - 次に再度
unzip
コマンドを実行して、今度は実際に解凍処理を実行する。処理したファイル名が出力されるので、これをpv
コマンドにつなぎ、-s (size)
オプションでファイル数を指定する
これで、こんな感じのプログレス・バーが表示されるようになる。
80.1k 0:00:09 [8.54k/s] [====================================>] 100%