Hitung berapa banyak ruang disk yang akan digunakan

25

Apakah di Linux ada program yang dapat menghitung berapa banyak data yang dihasilkan suatu program?

Sebagai contoh, jika saya ingin mengambil cadangan dari database MySQL saya biasanya akan saya lakukan

mysqldump > dumpfile.sql

Alih-alih, saya ingin mengarahkan ulang /dev/nulltetapi menghitung berapa banyak ruang disk yang akan digunakan, seperti

mysqldump | fancy_space_calc_program

Keluaran:

123456789 Bytes would have been used

Catatan, cadangan MySQL hanyalah sebuah contoh. Saya sangat menyadari bagaimana saya bisa memperkirakan ukuran sebelumnya, jadi tolong tidak ada komentar tentang itu.

fancyPants
sumber
1
Saya bahkan tidak berpikir Anda benar-benar bisa membuatnya; untuk kasus tertentu, ya, tetapi bukan penggunaan umum, karena bagaimana Anda dapat memperkirakan jika beberapa aplikasi memanggil beberapa server dan mengunduh data dari sana - tidak ada kemungkinan Anda dapat memperkirakan hal-hal seperti itu di aplikasi asing. Jadi ini akan menjadi per aplikasi - saat Anda menulis bahwa Anda sudah tahu untuk MYSQL - tidak ada penjelasan di sana, tetapi aplikasi lain - per aplikasi, tidak ada alat umum yang dapat melakukan prediksi seperti itu dengan benar.
Drako
1
Saya harap Anda menyadari bahwa setiap upaya untuk membuat perkiraan akan perlu untuk benar-benar menjalankan program dan mengamati hasilnya saat dikirim ke tempat yang aman. Ini akan menjadi mustahil jika program memiliki semacam efek yang tidak dapat diubah pada hal lain sehingga Anda HANYA dapat menjalankannya sekali tanpa efek samping yang tidak diinginkan. Masalah lainnya adalah bahwa jika program memperoleh outputnya dari input yang berubah, proses selanjutnya akan membuat file output (ukuran yang berbeda) yang lain. Last but not least: diskspace <> (byte output). Dan berbagai sistem file memiliki overhead yang berbeda untuk pembukuan.
Tonny
1
Ya, saya sangat sadar akan hal itu. Itu masih cukup baik untuk saya.
FancyPants
@ Drako Anda dapat memiliki cara umum untuk mengukur output teks suatu program. Itu tidak perlu per aplikasi (lihat misalnya jawaban yang diterima). Apakah output teks akan identik atau identik pada proses berikutnya adalah spesifik aplikasi, tetapi itu tidak mencegah Anda mengukur output secara umum. Agaknya OP dan siapa pun yang mencoba mengukur output hanya akan melakukannya jika datanya bermakna untuk aplikasi apa pun.
Jon Bentley
@ JonBentley Saya tidak pernah mengatakan kepada Anda bahwa Anda tidak dapat memilikinya, baca lebih hati-hati: "seperti yang saya tulis prediksi umum tidak akan tepat atau bahkan dekat :)" dan sekarang bayangkan aplikasi saya setelah berjalan akan memeriksa pembaruan itu sendiri, dari plugin , dll dan akan mengunduh x jumlah data dari i-net dan menyimpannya di hdd Anda; bagaimana Anda akan mengukur secara tepat di muka dengan alat umum yang tidak mengetahui apa-apa tentang aplikasi saya, berapa banyak penyimpanan yang akan dibutuhkan setelah menjalankannya? Tetap Anda dapat melakukan tebakan terbaik Anda dengan jawaban yang diterima dan dalam banyak kasus bahkan cukup tepat.
Drako

Jawaban:

37

Diambil dari /programming/13418688/use-pipe-with-du-to-compute-size-of-stdin

Anda bisa wc -cmengirimnya ke pipa untuk menghitung jumlah byte yang melewati pipa.

Tentu saja, ini hanya byte mentah, dan tidak ada hubungannya dengan ukuran sektor dll, jadi bawa dengan sebutir garam ...

Magnus
sumber
seperti yang saya tulis prediksi umum tidak akan tepat atau bahkan dekat :)
Drako
6
@cat implementasi yang baik wcakan membuang data yang tidak lagi dibutuhkan secepat praktis.
Ruslan
2
@cat Saya pikir itu tidak mungkin buffer, karena Anda tidak perlu buffering untuk menghitung garis atau karakter. GNU coreutils wcdi komputer saya dengan mudah menangani data stdin 40 GB, dengan hanya memori 8 GB.
Frxstrem
8
@ Magnus. Saya pikir Anda merindukan permainan kata. WC adalah istilah Inggris untuk apa yang orang Amerika sebut kamar mandi. Anda memipipkan data yang tidak digunakan ke dalam WC.
Dana Gugatan Monica
3
@Frxstrem Anda pasti lakukan perlu penyangga untuk menghitung garis atau karakter - segera setelah Anda tidak lagi bekerja dengan pengkodean isomorfik. Sejak POSIX.2, wc -ctidak menghitung karakter - ia menghitung byte. wc -mmenghitung karakter. Perbedaan yang paling jelas adalah karakter multi-byte seperti pada UTF-16 atau Windows \r\n(dua byte dalam ASCII, tetapi satu karakter). Itu tidak selalu membutuhkan banyak buffering sebagian besar waktu, tetapi Unicode dapat memiliki jumlah byte yang sewenang-wenang untuk mewakili karakter tunggal; bukan sesuatu yang akan Anda lihat dalam data tepercaya, tetapi kemungkinan buffer overflow vector.
Luaan
28

Perintah pv sempurna untuk ini.

mysqldump | pv -b > /dev/null

Saya pikir hal di atas akan memberi Anda perintah yang tepat yang Anda inginkan, mungkin perlu beberapa penyesuaian seperti pv -b | > /dev/nullsaya tidak bisa menguji sekarang

-b memberi Anda nilai dalam byte.

djsmiley2k - Kontrak Karya
sumber
1
Kudus, saya lupa tentang pv dan juga wc. Memalukan untukku. Saya ingin menerima kedua jawaban. Jadi, maaf, tapi Magnus sedikit lebih cepat dan dia bisa menggunakan reputasinya.
FancyPants
Ya jangan khawatir, trik wc sangat bagus, tidak yakin mengapa itu tidak segera terjadi pada saya tbh. Saya pertama kali pergi 'bar!' kemudian menyadari apa yang saya maksud adalah pv! :)
djsmiley2k
Dan sekarang Anda membuat saya bertanya-tanya tentang mengambil pegangan file, dan memeriksa ukuran di / proc di suatu tempat ....
djsmiley2k - CoW
2
Saya belum pernah mendengar pvsebelumnya .. Anda belajar sesuatu yang baru setiap hari :)
Magnus
2
@ Magnus: Saya pikir wc lebih tua (bagian dari beberapa sistem Unix yang lebih tua), tidak dalam dokumentasi sebanyak, dan (sangat mungkin sebagai hasilnya) pv sudah diinstal dalam distribusi yang lebih sedikit. Tetap saja senang mengetahui. Lihat gambar indah yang secara konseptual ini berasal dari halaman utama program "pv" ("pipe viewer")
TOOGAM
0

Anda dapat menggunakannya dduntuk itu, seperti ini cat /dev/zero | dd status=progress of=/dev/null bs=4M.

Ini memberi Anda beberapa data selama dan setelah eksekusi tentang jumlah data yang diteruskan ke sana, seperti:

$ 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
styrofoam terbang
sumber