Sie sind nicht angemeldet.

1

09.06.2008, 23:25

Welche Sprache? (Große Dateien binär/ascii)

Hallo zusammen,

ich wollte inemal eure Meinung hören zu einigen kleineren Programmieraufgaben die ich habe. Ich habe große Dateinen (~ 5GB) die sowohl Klartext als auch Binärdateien enthalten und zwar einen Kopf im Klartext dann einen großen BInärteil (etwas 95% des Files) und dann noch einmal etwas Klartext.
Ich möchte jetzt im wesentlichen dein Textteil bearbeiten und dazu den Binärteil erst mal wegschneiden. Da die Dateien sehr groß sind ist das performencekritisch. Wenn Ihr jetzt mal eure persönlichen Vorlieben weglasst - womit geht man da am besten drauf? Grundkenntnisse habe ich in Perl, Python, Scheme, c/c++ und Fortran90.
Ich würde mal Perl und c testen...? Perl ist sicher die schnellste "Skriptsprache", oder?
Außerdem interessiert mich auch die Bearbeitung des Binärteils der da in der Mitte steht. Damit kenne ich mich gar nicht aus, hat damit jemand ne gute EInführung dazu? Muss ich dazu eine Art "encoding" kennen? Oder genügt es zu wissen, ob das File little oder big endian ist?

Danke Gen-Too

2

09.06.2008, 23:34

Wenn DU den Binärteil rausschneiden willst, gibt es zusätzliche Infos?
z.B. eine bestimmte "zeichenfolge", mit der der Binärteil anfängt, Endet?

Je mehr Infos Du darüber hast, desto genauer, schneller kannst DU schneiden.

Für Deine 2. Frage:
Was willst Du genau mit dem Binärteil machen, bzw. was sind das für Daten??

P.S. Welche Programmiersprache verwendet wird, hängt übrigens auch von diesen Zusatzinfos ab. Wenn z.B. die ersten 10 zeilen und die letzten 10 Benutz werden sollen, würde ich es mit head/tail machen, bei anderen Bedingungen eine andere Sprache ... wobei C nie schlecht ist ;o)
Meine Rechtschreibfehler sind gewollt und unterliegen dem Copyright des Verfassers, es sei denn, sie sind explizit unter die GPL gestellt .....

Außerdem sind sie ein Ausdruck der Persönlichkeit des Schreibers!

3

10.06.2008, 06:48

Schließe mich Wernieman an. head und tail ... auch ein dd um die Dateien aufzuspaltenbzw. cat um sie wieder zusammen zu fügen. hexdump zeigt die die Binärteile an. Soweit in der Shell ...

Ansonsten, wenn es um Performance geht: fopen, fseek, read, write und fclose in C. Alle anderen (inkl. Scriptsprachen) machen das über Umwege auch mit diesen Funktionen ... schneller kriegst du's nicht. ... dafür weniger flexibel ;)

Wg. encoding: gerade bei dem Binärteil brauchst du das nicht: du liest einen Speicherblock und schreibst einen Speicherblock. Aus. Da ist es ziemlich egal, da keine Konvertierung vorgenommen wird. Vorausgesetzt du fängst nicht an, die Binärdaten zu interpretieren und mit diesen zu rechnen, dann hat Big/Little Endian sehr wohl einen Effekt.

Im Übrigen denke ich, bist du in der Shell damit aber am besten beraten ...
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

4

10.06.2008, 08:05

Zitat

Ich habe große Dateinen (~ 5GB) die sowohl Klartext als auch Binärdateien enthalten und zwar einen Kopf im Klartext dann einen großen BInärteil (etwas 95% des Files) und dann noch einmal etwas Klartext.

Was sind denn das für lustige Dateien?
Und welcher Art sollen die Manipulationen sein?

Zitat

Ich möchte jetzt im wesentlichen dein Textteil bearbeiten und dazu den Binärteil erst mal wegschneiden. Da die Dateien sehr groß sind ist das performencekritisch.

Also wenn Du sowieso ein eigenständiges Programm benötigst, kannst Du die Shell außen vorlassen. Dann hast Du eben eine Schleife zum auslesen des Kopfteils, eine für den Binärkörper und eine für den Rest.

Zitat

Da die Dateien sehr groß sind ist das performencekritisch.

Wes heißt performancekritisch? Wird schon seine Zeit dauern. Andererseits, jenachdem was Du vorhast, wirst Du eh nicht umhin kommen, einen Puffer im Hauptspeicher anzulegen, da die Zugriffe da ein wenig schneller vonstatten gehen als wenn die Daten extern gehalten werden. Das bloße Auslesen wird mit keiner Sprache "wesenlich schneller" gehen. Ebenso, wenn Du Veränderungen direkt vornimmst. Spaßig wird's bei Suchalgorithmen oder Sortieralgorithmen.

Zitat

Wenn Ihr jetzt mal eure persönlichen Vorlieben weglasst - womit geht man da am besten drauf?

Unabhängig würde ich sagen: Nimm die Sprache, mit der Du am besten zurechtkommst ;)
Wenn Dir Performance so wichtig ist, ist C keine schlechte Wahl.

P.S.: Wie wahrscheinlich ist es denn, daß das Byteordering zu dem in Deinem Rechner differiert?
Unix wurde nicht entwickelt, um seine Benutzer daran zu hindern, dumme Dinge zu tun, denn das würde diese auch davon abhalten, schlaue Dinge zu tun.“ – Doug Gwyn

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »lilith2k3« (10.06.2008, 08:23)


5

10.06.2008, 20:25

Danke für die Meinungen,

Zitat

Wenn DU den Binärteil rausschneiden willst, gibt es zusätzliche Infos?
z.B. eine bestimmte "zeichenfolge", mit der der Binärteil anfängt, Endet?


Ja, die gibt es, man kann hier nach Schlüsselworten suchen. Habe das mal flink mit sed umgesetzt und da beträgt die Laufzeit bei so einem File etwa 10 Minuten.

Zitat

Was willst Du genau mit dem Binärteil machen, bzw. was sind das für Daten??

Das sind GItterinformationen für ein GItter das für numerische Berechnungen verwendet wird. Weil die Modelle sehr groß sind wird das binär geschrieben. Ich möchte die Infornationen auslesen manipulieren und wieder schneiden. Das Format ist generell dokumentiert. Wie ich an ein ASCII-File rangehen würde weiss ich, aber BInär? Muss ich Bitweise einlesen und umwandeln um das dan interpretieren zu können? Dazu fehlen mir die Grundlagen hat jemand da einen Literaturtipp oder so?

Zitat

Schließe mich Wernieman an. head und tail ... auch ein dd um die Dateien aufzuspaltenbzw. cat um sie wieder zusammen zu fügen. hexdump zeigt die die Binärteile an. Soweit in der Shell ...

Mösste ich prüfen aber ich denke das läuft nicht, weil die Zeilenzahl sich schon unterscheiden kann, die vorne und hinten weg muss.

So ich hoffe das lässt euch mal ein wenig klarer sehen...