[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: datei zerhacken und per netcat verschicken



David Haller <lists@dhaller.de> writes:

>>  dd if=$1 of=- bs=584 seek=$SEEK count=1 |\
>
> Da fehlt die Umrechung in die Bloecke (s.u.)... Du rufst so dd fuer
> jedes byte auf...

Was meinst Du mit "Umrechung in die Blöcke"?

Dieser Befehl führt eine einzige Leseoperation aus, in der er 584 Bytes
liest. Fehlerhaft ist allerdings, daß "seek" nicht im Input, sondern im
Output Blöcke überspringt. Gemeint war wohl "skip".

> BLKSZ=584
> [...]
>     dd if="$1" bs="$BLKSZ" seek="$seek" count=1 | \

Abgesehen vom fehlenden "of=-", Unterschieden im Quoting und unter-
schiedlichen Variablennamen unterscheidet sich das nicht von der Zeile,
die Du kritisiert hattest.

> Diese Loesung hat allerdings den Nachteil, dass bei grossen Dateien
> die Ausfuehrungszeit exponentiell steigt, weil fuer jedes Fragment a
> $BLKSZ Bytes die Datei neu geoeffnet werden muss, an die richtige
> Stelle ge"seek"t werden muss, und dann jeweils nur ein Block von
> $BLKSZ Bytes gelesen und ausgegeben wird... Bei kleinen Dateien (sagen
> wir, bis 100 * $BLKSZ) geht das noch, aber darueber wird's schnell
> eklig.

Die Zeit, um an eine bestimmte Stelle in einer Datei zu "seeken", ist
ungefähr konstant, unabhängig davon, wo in der Datei die Stelle liegt.
Darum ist die Ausführungszeit des Skriptes _linear_ von der Dateigröße
abhängig.

Davon, daß dd tatsächlich den Systemcall "lseek" verwendet, kann man
sich im Quellcode (coreutils 5.2.1) in Datei src/dd.c, Zeile 818
überzeugen.

Martin



Reply to: