计算将使用多少磁盘空间


25

Linux上是否有一个程序可以计算一个程序将产生多少数据?

例如,如果我想备份我的MySQL数据库,我通常会这样做

mysqldump > dumpfile.sql

相反,我想重定向到,/dev/null但要计算将使用多少磁盘空间,例如

mysqldump | fancy_space_calc_program

输出:

123456789 Bytes would have been used

注意,MySQL备份只是一个例子。我非常了解如何预先估算尺寸,因此请勿对此发表评论。


1
我什至不认为你真的可以做一个。在特定情况下可以,但不能用于一般用途,因为您可以估算某些应用程序是否调用某个服务器并从该服务器下载数据-您不可能在外部应用程序中估算此类情况。因此,这将是每个应用程序-正如您所写的那样,您已经对MYSQL有所了解-那里没有解释,但是其他应用程序-每个应用程序,没有任何通用工具可以正确地进行这种预测。
Drako

1
我希望您认识到,进行估计的任何尝试都需要实际运行该程序,并在将其发送到安全的地方时观察输出。如果程序对别的东西有某种不可逆的影响,那么这将是不可能的,因此您只能运行一次而不会产生意想不到的副作用。另一个问题是,如果程序从更改的输入中获取其输出,则下一次运行将创建另一个(不同大小)输出文件。最后但并非最不重要的:磁盘空间<>(输出字节)。各种文件系统的簿记开销也不同。
托尼

1
是的,我很清楚。对我来说仍然足够好。
fantPant'17

@Drako您可以使用一种通用的方法来测量程序的文本输出。那不需要是每个应用程序(例如,请参见已接受的答案)。文本输出在以后的运行中是否会可靠地相同是特定于应用程序的,但这并不妨碍您以常规方式测量输出。大概OP和其他任何尝试测量输出的人都只会在数据对于任何给定应用有意义的情况下才这样做。
乔恩·本特利

@JonBentley我从未告诉过你它不能拥有它,请更仔细地阅读:“正如我所写的一般预测不会精确甚至接近:)”,现在想象我的应用程序运行后将检查自身,插件的更新,等等,并将从i-net下载x量的数据并将其存储在您的硬盘上;不知道我的应用程序的情况下,如何使用通用工具提前进行精确测量,运行该应用程序后需要多少存储空间?您仍然可以通过可接受的答案来做出最佳猜测,甚至在很多情况下都非常准确。
Drako

Answers:


37

取自/programming/13418688/use-pipe-with-du-to-compute-size-of-stdin

您可以通过管道wc -c进行计数,以计算通过管道的字节数。

当然,这只是原始字节,与扇区大小等无关,所以请放一口盐...


正如我所写的那样,一般的预测不会是精确的甚至是接近的:)
Drako

6
@cat的一个好的实现wc将在实际可行的情况下尽快丢弃不再需要的数据。
罗斯兰

2
@cat我认为它不太可能被缓冲,因为您不需要缓冲来计算行或字符。wc我计算机上的GNU coreutils 可以轻松处理40 GB stdin数据,而只有8 GB内存。
Frxstrem '17

8
@马格努斯 我想你错过了文字游戏。WC是英国人所称的浴室。您正在将未使用的数据传送到WC中。
基金莫妮卡的诉讼

3
@Frxstrem你肯定必要的缓冲计算行或字符-只要你不再与同构编码工作。从POSIX.2开始,wc -c不计算字符-它计算字节。wc -m计算字符。最明显的区别是在UTF-16或Windows中使用了多字节字符\r\n(ASCII中为两个字节,但一个字符)。在大多数情况下,它不一定需要大量缓冲,但是Unicode可以具有任意数量的字节来表示单个字符。不是在可信数据中看到的东西,而是可能的缓冲区溢出向量。
a安

28

命令pv对此很完美。

mysqldump | pv -b > /dev/null

我认为以上内容将为您提供所需的正确命令,可能需要进行一些调整,例如pv -b | > /dev/null我现在无法测试

-b 给您一个以字节为单位的值。


1
天哪,我忘记了光伏和厕所。真可惜 我想接受两个答案。因此,很抱歉,但是Magnus的速度快了一点,他可以使用这个声誉。
fancyPant

是的,不用担心,wc技巧真是太好了,不确定为什么我没有立即想到它。我首先去了“酒吧!” 然后意识到我的意思是光伏!:)
djsmiley2k-CoW

现在你让我想知道抓住的文件句柄,并检查在/ proc某处尺寸....
djsmiley2k -牛

2
我以前从未听说pv过。.您每天都会学到一些新东西:)
马格努斯

2
@Magnus:我认为wc较旧(某些较旧的Unix系统的一部分),没有那么多的文档,并且(很可能是结果)pv预先安装了较少的发行版。不过,很高兴知道。请看这张概念上很漂亮的图片,它来自“ pv”(“管道查看器”)程序的首页
TOOGAM,2017年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.