Calcule cuánto espacio en disco se habría utilizado


25

¿Existe en Linux un programa que pueda calcular cuántos datos produciría un programa?

Por ejemplo, si quisiera hacer una copia de seguridad de mi base de datos MySQL, normalmente lo haría

mysqldump > dumpfile.sql

En cambio, me gustaría redirigir /dev/nullpero calcular cuánto espacio en disco se habría utilizado, como

mysqldump | fancy_space_calc_program

Salida:

123456789 Bytes would have been used

Tenga en cuenta que la copia de seguridad de MySQL es solo un ejemplo. Soy muy consciente de cómo podría estimar el tamaño de antemano, así que no hay comentarios al respecto.


1
Ni siquiera creo que realmente puedas hacer uno; para casos específicos sí, pero no para uso general, porque cómo puede estimar si alguna aplicación llama a algún servidor y descarga datos desde allí, no hay posibilidad de que pueda estimar tales cosas en aplicaciones extranjeras. Entonces, esto sería por aplicación, mientras escribe que ya sabe para MYSQL, no hay explicación, pero otras aplicaciones, por aplicación, ninguna herramienta general podría hacer esa predicción correctamente.
Drako

1
Espero que se dé cuenta de que cualquier intento de hacer la estimación requeriría ejecutar realmente el programa y observar la salida mientras se envía a un lugar seguro. Esto será imposible si el programa tiene algún tipo de efecto irreversible en otra cosa, por lo que SOLO puede ejecutarlo una vez sin efectos secundarios no deseados. El otro problema es que si el programa deriva su salida de una entrada cambiante, la próxima ejecución creará otro archivo de salida (de diferente tamaño). Por último, pero no menos importante: espacio en disco <> (bytes de salida). Y varios sistemas de archivos tienen diferentes gastos generales para la contabilidad.
Tonny

1
Sí, soy muy consciente de eso. Todavía es lo suficientemente bueno para mí.
fancyPants

@Drako Puede tener una forma general de medir la salida de texto de un programa. Eso no necesita ser por aplicación (ver, por ejemplo, la respuesta aceptada). Si la salida de texto será confiablemente idéntica en ejecuciones posteriores es específica de la aplicación, pero eso no le impide medir la salida de manera general. Presumiblemente, el OP y cualquier otra persona que intente medir la salida solo lo harían si los datos fueran significativos para cualquier aplicación dada.
Jon Bentley

@JonBentley Nunca te dije que no puedes tenerlo, lee con más cuidado: "como escribí, la predicción general no será precisa ni cercana :)" y ahora imagina que mi aplicación después de ejecutar buscará actualizaciones de sí misma, de complementos , etc. y descargará x cantidad de datos de i-net y los almacenará en su disco duro; ¿Cómo va a medir con anticipación con precisión con la herramienta general sin saber nada sobre mi aplicación, cuánto almacenamiento se necesitará después de ejecutarla? Aún así, puede hacer su mejor suposición con la respuesta aceptada y, en muchos casos, incluso ser bastante preciso.
Drako

Respuestas:


37

Tomado de /programming/13418688/use-pipe-with-du-to-compute-size-of-stdin

Puede canalizarlo wc -cpara contar el número de bytes que pasan por la canalización.

Por supuesto, esto es solo los bytes sin procesar, y no tiene nada que ver con el tamaño del sector, etc., así que tómalo con un grano de sal ...


como escribí, la predicción general no será precisa ni cercana :)
Drako

66
@cat una buena implementación de wcdescartará los datos que ya no necesita tan pronto como sea posible.
Ruslan

2
@cat Creo que es poco probable que se almacenen en búfer, ya que no necesita almacenamiento en búfer para contar líneas o caracteres. GNU coreutils wcen mi computadora maneja fácilmente datos estándar de 40 GB, con solo 8 GB de memoria.
Frxstrem

8
@Magnus. Creo que te perdiste el juego de palabras. WC es un término británico para lo que los estadounidenses llaman baño. Estás canalizando los datos no utilizados en el WC.
Financia la demanda de Mónica

3
@Frxstrem Por supuesto que lo hacen necesidad de amortiguación para contar líneas o caracteres - tan pronto como ya no está trabajando con una codificación isomorfos. Desde POSIX.2, wc -cno cuenta caracteres, cuenta bytes. wc -mcuenta personajes. La diferencia más obvia está en los caracteres de varios bytes como en UTF-16 o Windows \r\n(dos bytes en ASCII, pero un carácter). No necesariamente necesita mucho almacenamiento en búfer la mayor parte del tiempo, pero Unicode puede tener una cantidad arbitraria de bytes para representar un solo carácter; no es algo que verías en datos confiables, sino un posible vector de desbordamiento de búfer.
Luaan

28

El comando pv es perfecto para esto.

mysqldump | pv -b > /dev/null

Creo que lo anterior le dará el comando correcto que desea, puede necesitar algunos ajustes, pv -b | > /dev/nullcomo no puedo probar en este momento

-b le da un valor en bytes.


1
Santo, me olvidé de pv y wc. Me avergüenza. Me gustaría aceptar ambas respuestas. Entonces, lo siento, pero Magnus fue un poco más rápido y puede usar la reputación.
fancyPants

Sí, no te preocupes, el truco del baño es realmente agradable, no estoy seguro de por qué eso no se me ocurrió de inmediato. Primero fui 'bar!' Entonces me di cuenta de lo que quería decir era pv! :)
djsmiley2k - CoW

Y ahora me tienes pensando en agarrar el identificador de archivo, y la comprobación de un tamaño en algún lugar / proc ....
djsmiley2k - Vaca

2
Nunca había escuchado pvantes ... Aprendes algo nuevo todos los días :)
Magnus

2
@Magnus: Creo que wc es más antiguo (parte de algunos sistemas Unix más antiguos), no está en tanta documentación y (posiblemente como resultado) pv está preinstalado en menos distribuciones. Aún así, es bueno saberlo. Vea esta imagen conceptualmente hermosa que proviene de la página de inicio del programa "pv" ("visor de tuberías")
TOOGAM

0

Puedes usarlo ddasí cat /dev/zero | dd status=progress of=/dev/null bs=4M.

Esto le proporciona algunos datos durante y después de la ejecución sobre la cantidad de datos que se le pasan, como:

$ 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.