Berechnen Sie, wie viel Speicherplatz verwendet worden wäre


25

Gibt es unter Linux ein Programm, das berechnen kann, wie viele Daten ein Programm produzieren würde?

Wenn ich zum Beispiel eine Sicherungskopie meiner MySQL-Datenbank erstellen möchte, würde ich dies normalerweise tun

mysqldump > dumpfile.sql

Stattdessen möchte ich umleiten, /dev/nullaber berechnen, wie viel Speicherplatz wie verwendet worden wäre

mysqldump | fancy_space_calc_program

Ausgabe:

123456789 Bytes would have been used

Beachten Sie, dass das MySQL-Backup nur ein Beispiel ist. Mir ist sehr wohl bekannt, wie ich die Größe vorab einschätzen kann, also bitte keine Kommentare dazu.


1
Ich glaube nicht einmal, dass du wirklich einen machen kannst. für bestimmte Fälle ja, aber nicht allgemein, denn wie können Sie abschätzen, ob eine App einen Server aufruft und Daten von dort herunterlädt? Keine Chance, dass Sie solche Dinge in fremden Apps abschätzen können. Das wäre also pro App - wie Sie schreiben, dass Sie bereits für MYSQL wissen - keine Erklärung dafür, aber für andere Apps - pro App könnte kein allgemeines Tool eine solche Vorhersage richtig machen.
Drako

1
Ich hoffe, Sie erkennen, dass jeder Versuch, die Schätzung vorzunehmen, das Ausführen des Programms und die Beobachtung der Ausgabe erfordern würde, während es an einen sicheren Ort gesendet wird. Dies ist unmöglich, wenn das Programm einen irreversiblen Effekt auf etwas anderes hat, sodass Sie es NUR einmal ohne unbeabsichtigte Nebenwirkungen ausführen können. Das andere Problem ist, dass, wenn das Programm seine Ausgabe von einer sich ändernden Eingabe ableitet, der nächste Lauf eine andere Ausgabedatei (mit einer anderen Größe) erstellt. Last but not least: Plattenspeicherplatz <> (Bytes der Ausgabe). Und verschiedene Dateisysteme haben unterschiedliche Gemeinkosten für die Buchhaltung.
Heute,

1
Ja, das ist mir klar. Es ist immer noch gut genug für mich.
FancyPants

@Drako Sie können die Textausgabe eines Programms auf allgemeine Weise messen. Das muss nicht per App sein (siehe zB die akzeptierte Antwort). Ob die Textausgabe bei nachfolgenden Durchläufen zuverlässig identisch ist oder nicht, ist app-spezifisch. Dies hindert Sie jedoch nicht daran, die Ausgabe allgemein zu messen. Vermutlich würden das OP und jeder andere, der versucht, die Leistung zu messen, dies nur tun, wenn die Daten für eine bestimmte Anwendung von Bedeutung sind.
Jon Bentley

@ JonBentley Ich habe dir nie gesagt, dass du es nicht haben kannst. Lies genauer: "Wie ich geschrieben habe, wird die allgemeine Vorhersage nicht präzise oder sogar knapp :)" und stelle dir jetzt vor, dass meine App nach dem Start nach Updates von sich selbst und von Plugins suchen wird , etc und lädt x Datenmengen von i-net herunter und speichert diese auf Ihrer Festplatte. Wie werden Sie im Voraus genau messen, wenn Sie mit dem allgemeinen Tool nichts über meine App wissen? Wie viel Speicher wird nach dem Ausführen benötigt? Trotzdem können Sie mit akzeptierten Antworten Ihre besten Vermutungen anstellen und in vielen Fällen sogar ziemlich präzise sein.
Drako

Antworten:


37

Entnommen aus https://stackoverflow.com/questions/13418688/use-pipe-with-du-to-compute-size-of-stdin

Sie können es weiterleiten, wc -cum die Anzahl der Bytes zu zählen, die die Pipeline durchlaufen.

Das sind natürlich nur die rohen Bytes und haben nichts mit der Sektorgröße usw. zu tun. Nehmen Sie es also mit einem Körnchen Salz ...


Wie ich schrieb, ist die allgemeine Vorhersage nicht präzise oder sogar knapp :)
Drako

6
Bei einer guten Implementierung von @cat wcwerden Daten verworfen , die nicht mehr benötigt werden, sobald dies praktikabel ist.
Ruslan

2
@cat Ich denke, es ist unwahrscheinlich, dass es gepuffert wird, da Sie keine Pufferung benötigen, um Zeilen oder Zeichen zu zählen. GNU-Coreutils wcauf meinem Computer verarbeiten problemlos 40 GB Standarddaten mit nur 8 GB Arbeitsspeicher.
Frxstrem

8
@ Magnus. Ich denke, Sie haben das Wortspiel verpasst. WC ist ein britischer Begriff für das, was Amerikaner ein Badezimmer nennen. Sie leiten die nicht verwendeten Daten in das WC.
Fund Monicas Klage

3
@Frxstrem Sie sicherlich tun müssen Pufferung Linien oder Zeichen zu zählen - sobald Sie nicht mehr mit einer isomorph Codierung arbeiten. Zählt seit POSIX.2 wc -ckeine Zeichen, sondern Bytes. wc -mzählt Zeichen. Der offensichtlichste Unterschied besteht in Multibyte-Zeichen wie in UTF-16 oder Windows \r\n(zwei Bytes in ASCII, aber ein Zeichen). Die meiste Zeit muss nicht unbedingt viel gepuffert werden, aber Unicode kann eine beliebige Anzahl von Bytes aufweisen, um ein einzelnes Zeichen darzustellen. Nicht etwas, das Sie in vertrauenswürdigen Daten sehen würden, sondern ein möglicher Pufferüberlaufvektor.
Luaan

28

Der Befehl pv ist dafür perfekt.

mysqldump | pv -b > /dev/null

Ich denke, das obige gibt Ihnen den richtigen Befehl, den Sie wollen. Möglicherweise muss er angepasst werden, so pv -b | > /dev/nullwie ich es derzeit nicht testen kann

-b gibt Ihnen einen Wert in Bytes.


1
Heilig, ich habe sowohl pv als auch wc vergessen. Schande über mich. Ich möchte beide Antworten akzeptieren. Tut mir leid, aber Magnus war ein bisschen schneller und er kann den Ruf nutzen.
FancyPants

Ja, keine Sorge, der Wc-Trick ist wirklich nett, ich bin mir nicht sicher, warum mir das nicht sofort einfiel. Ich ging zuerst "Bar!" dann wurde mir klar was ich meinte war pv! :)
djsmiley2k - CoW

Und jetzt habe ich mich gefragt,
ob ich das Dateihandle greifen und

2
Ich habe noch nie davon gehört pv.. Sie lernen jeden Tag etwas Neues :)
Magnus

2
@Magnus: Ich denke, wc ist älter (Teil einiger älterer Unix-Systeme), nicht so dokumentiert, und pv ist (möglicherweise als Folge davon) in weniger Distributionen vorinstalliert. Trotzdem schön zu wissen. Sehen Sie sich dieses konzeptionell schöne Bild an, das von der Homepage des Programms "pv" ("pipe viewer") stammt
TOOGAM

0

Sie können ddes so verwenden cat /dev/zero | dd status=progress of=/dev/null bs=4M.

Dadurch erhalten Sie während und nach der Ausführung einige Daten über die an sie übergebene Datenmenge, wie z.

$ 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.