使用されるディスク領域の量を計算します


25

Linuxには、プログラムが生成するデータ量を計算できるプログラムがありますか?

たとえば、MySQLデータベースのバックアップを取りたい場合、通常は

mysqldump > dumpfile.sql

代わりに、リダイレクトしたい/dev/nullが、どのくらいのディスクスペースが使用されるかを計算したい。

mysqldump | fancy_space_calc_program

出力:

123456789 Bytes would have been used

注、MySQLバックアップは単なる例です。事前にサイズを見積もる方法をよく知っているので、それについてはコメントしないでください。


1
本当に作れるとは思いません。特定のケースではありますが、一部のアプリがサーバーを呼び出してそこからデータをダウンロードするかどうかを推定する方法-外国のアプリでそのようなことを推定することはできません。したがって、これはアプリごとになります-MYSQLについてすでに知っていることを書いているように-説明はありませんが、他のアプリ-アプリごとに、一般的なツールはそのような予測を正しく行うことができません。
ドラコ

1
推定を行うには、プログラムを実際に実行し、安全な場所に送信されている間に出力を観察する必要があることを理解してください。これは、プログラムが他の何かに何らかの不可逆的な影響を与える場合、不可能になるため、意図しない副作用なしで一度だけ実行できます。もう1つの問題は、プログラムが変化する入力から出力を導出する場合、次の実行で別の(異なるサイズの)出力ファイルが作成されることです。最後になりましたが、ディスクスペース<>(出力のバイト数)。また、さまざまなファイルシステムでは、簿記のオーバーヘッドが異なります。
トニー

1
はい、私はそれをよく知っています。私にとってはまだ十分です。
fancyPants

@Drakoプログラムのテキスト出力を測定する一般的な方法があります。これはアプリごとである必要はありません(たとえば、受け入れられた答えを参照)。テキスト出力が後続の実行で確実に同一になるかどうかはアプリ固有ですが、それは一般的な方法で出力を測定することを妨げません。おそらく、OPと出力を測定しようとする他の人は、データが特定のアプリケーションにとって意味がある場合にのみそうするでしょう。
ジョンベントレー

@JonBentley私はあなたにそれを持てないと言ったことはありません、もっと注意深く読んでください:「私が書いたように、一般的な予測は正確でもなく、近くさえありません:)」そして今、実行後の私のアプリがプラグインのそれ自体の更新をチェックすることを想像してくださいなど、i-netからx個のデータをダウンロードして、hddに保存します。私のアプリについて何も知らない一般的なツールで事前に正確に測定する方法、それを実行した後にどれくらいのストレージが必要になるのですか?それでも、受け入れられた答えを使用して最善の推測を行うことができ、多くの場合、かなり正確です。
ドラコ

回答:


37

https://stackoverflow.com/questions/13418688/use-pipe-with-du-to-compute-size-of-stdinから取得

パイプを使用wc -cして、パイプラインを通過するバイト数をカウントできます。

もちろん、これは単なる生のバイトであり、セクターサイズなどとは関係ないので、一粒の塩で処理してください。


私が書いたように、一般的な予測は正確でもなく、近いものでもありません:)
Drako

6
@catの適切な実装は、wc必要がなくなったデータをできるだけ早く破棄します。
ルスラン

2
@cat行や文字をカウントするためにバッファリングする必要がないため、バッファリングされる可能性は低いと思います。wc私のコンピューターのGNU coreutils は、わずか8 GBのメモリーで40 GBのstdinデータを簡単に処理します。
Frxstrem

8
@マグナス。あなたは言葉遊びを逃したと思います。WCは、アメリカ人がバスルームと呼んでいるものを表す英国の用語です。未使用のデータをWCにパイピングしています。
ファンドモニカの訴訟

3
@Frxstrem確かに、同型エンコーディングを使用しなくなったらすぐに、行や文字をカウントするためにバッファリング必要になります。POSIX.2以降、wc -c文字はカウントされません-バイトがカウントされます。wc -m文字をカウントします。最も明らかな違いは、UTF-16やWindowsなどのマルチバイト文字\r\n(ASCIIでは2バイトですが、1文字)です。ほとんどの場合、必ずしも大量のバッファリングを必要とするわけではありませんが、Unicodeは単一の文字を表すために任意の量のバイトを持つことができます。信頼できるデータに表示されるものではなく、バッファオーバーフローベクトルの可能性があります。
ルアーン

28

コマンドpvはこれに最適です。

mysqldump | pv -b > /dev/null

上記はあなたが望む正しいコマンドをあなたに与えると思う、それはpv -b | > /dev/null私が今すぐテストできないなどのいくつかの調整を必要とするかもしれない

-b バイト単位の値を提供します。


1
神聖な、私はpvとwcを忘れました。恥を知れ。両方の答えを受け入れたいです。申し訳ありませんが、マグナスは少し速く、評判を使用することができます。
fancyPants

心配はいりません。wcのトリックは本当に素晴らしいです。なぜそれがすぐに私に起こらなかったのかはわかりません。最初に「バー!」そして、私が意味するのはpvであることに気付きました!:)
djsmiley2k-CoW

そして今、あなたは私....ファイルハンドルをつかん疑問を抱いて、そしてサイズのためでは/ procのどこかをチェックする持っている
のCoW - djsmiley2k

2
私はpv前に聞いたことがありません。あなたは毎日新しいことを学ぶ:)
マグナス

2
@Magnus:wcは古いドキュメント(一部の古いUnixシステムの一部)であり、それほど多くのドキュメントではなく、(おそらく結果として)pvはより少ないディストリビューションでプリインストールされていると思います。それでも、知ってうれしいです。「pv」(「パイプビューア」)プログラムのホームページから来たこの概念的に美しい写真ご覧ください
TOOGAM

0

ddこのように使用できますcat /dev/zero | dd status=progress of=/dev/null bs=4M

これにより、実行中および実行後に、渡されるデータの量に関するデータが提供されます。

$ cat /dev/zero | dd status=progress of=/dev/null                                                                                                                              
5371334656 bytes (5.4 GB, 5.0 GiB) copied, 4 s, 1.3 GB/s^C # this is progress data
12271136+0 records in #summary
12271135+0 records out #summary
6282821120 bytes (6.3 GB, 5.9 GiB) copied, 4.66683 s, 1.3 GB/s #summary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.