Mario: große Zahlen kodieren dekodieren - platzsparend und performant

Hallo,

Ich will eine große Liste an großen Zahlen in einer Textdatei abspeichern. Meine Überlegung ist, die Zahlen in Ascii umzuwandeln, damit ich einen Satz von Zahlen mit festen Breiten abspeichern und später via Chunk_split auseinander nehmen kann.

Wenn ich chr() und ord() verwende kann ich theoretisch den Zahlenbereich von 1-256 abspeichern. Wenn ich auf Nummer sicher gehen will (Stichwort: Server- und Sprachunabhängigkeit), kann ich nur 95 Zeichen (Ascii-Code zwischen  32-127) verwenden.
Mein Wunschzahlenbereich liegt bei 100.000.

Ich brauche als eine sehr schnelle Möglichkeit um aus z.B. der Zahl "27.564" ein dreistelliges String (Einzelstring im Zahlenbereich 32-127) zu erzeugen bzw. zu decodieren.

Ich bin aber auch für jede andere Idee zu haben, die eine große Liste an Zahlen platzsparend abspeichern und performant ein- und auslesen kann.

Viele Grüße, Mario Lorenz

  1. Hallo Mario,

    Dein Problem ist mir nicht einleuchten. Selbst wenn Du alle Werte im Bereich 1 bis 100000 mit einem Umbruch in eine Datei schreibst, hast Du eine Datei von insgesamt 588895 Byte. Das ist weder sonderlich groß, noch kopliziert.

    Warum willst Du die Werte denn umkodieren?

    Gruß aus Berlin!
    eddi

    --
    Manchmal trifft es einen doch ganz unverhofft t86591:
    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
    1. Hallo Eddi,

      Jede Zeile in der Problem-Datei steht für ein Wort. In einer zweiten Datei sind X-Wörter mit Zeilenumbruch untereinander. Die ermittelten Zeilennummern aus dieser Datei sind sozusagen meine X-Achse.

      Die Beschreibung der Y-Achse befindet sich in einer dritten Datei (Ebenfalls eine Datei mit - diesmal - X-Links).

      In meiner Problemdatei befinden sich also Zeilenweise die Anzahl der Treffer eines Wortes, spaltenweise verweisend auf Links in einer dritten Datei.

      Oops das versteht ja keiner, darum hier bildlich:

      Wort1, 2345,455,56
      Wort2,   46, 34, 0

      Datei1
      Datei2
      Datei3

      Soll heißen Wort1 befindet sich 2345 x in Datei 1, 455 x in Datei 2, 56 x in Datei 3.

      Das ganze ergibt ein Index-Ranking für eine Lokale Suchmaschine.

      Du Denkst also, wenn ich in meiner Problemdatei einfach die Zahlen mit einem Seperator ("|") getrennt abspeichere (Bei Null dann kein Eintrag), bin ich schneller via Implode/Explode in der Suche als mit meiner Ascii-Variante?

      Viele Grüße aus Leipzig,

      Mario

      1. Hallo Mario,

        Du Denkst also, wenn ich in meiner Problemdatei einfach die Zahlen mit einem Seperator ("|") getrennt abspeichere (Bei Null dann kein Eintrag), bin ich schneller via Implode/Explode in der Suche als mit meiner Ascii-Variante?

        quod ERIT(!) demonstradum

        Sofern die einmal abgerufene Suche für ein Begriff nicht gecacht werden soll, bin ich (den Beweis schuldig bleibend) dieser Ansicht.

        Gruß aus Berlin!
        eddi

        --
        Manchmal trifft es einen doch ganz unverhofft t86591:
        > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
        Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
  2. Hallo Mario,

    warum benutzt du nicht fest kodierte 32-Bit-Zahlen? Z. B. so:

    fwrite($fd,pack("L",$number),4);

    Auf diese Weise hat jede Zahl 4 Byte und du kannst den Zahlenbereich
    von 32 Bit unsigned darstellen. Auslesen kannst du das dann so:

    $number = unpack("L",fread($fd,4));
    echo "nummer ist: ".$number[0]."\n";

    Siehe auch:

    http://php.net/pack
      http://php.net/unpack

    Grüße,
     CK

    --
    Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
    http://wwwtech.de/
    1. Ich glaub das ist es, ich probier es heute Abend gleich aus.

      Ich habe Eddie beschrieben, wozu ich das ganze brauche. Denkst Du das dies eine performante und platzsparende Lösung ist?

      Danke,

      Mario

      1. Hallo Mario,

        Ich habe Eddie beschrieben, wozu ich das ganze brauche. Denkst Du
        das dies eine performante und platzsparende Lösung ist?

        Ich denke, es ist die einfachste Loesung unter den beschriebenen
        Umstaenden.

        Grüße,
         CK

        --
        Sein oder nicht sein, das ist hier die Frage!
        http://wwwtech.de/