große Zahlen kodieren dekodieren - platzsparend und performant
Mario
- php
0 XaraX0 Christian Kruse0 Mario
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
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
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
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
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
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
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