Leichte Beize für Grundtypen in Python?

7

Ich möchte nur Tupel von Strings oder Ints serialisieren und unserialisieren.

Ich schaute auf pickle.dumps (), aber der Byte-Overhead ist signifikant. Im Grunde genommen sieht es so aus, als würde es etwa 4x soviel Platz benötigen, wie es braucht. Außerdem brauche ich nur Basistypen und muss Objekte nicht serialisieren.

Marshal ist ein wenig besser in Bezug auf den Platz, aber das Ergebnis ist voller bösen \ x00 Bytes. Idealerweise möchte ich, dass das Ergebnis für den Menschen lesbar ist.

Ich dachte daran, nur rep () und eval () zu verwenden, aber gibt es eine einfache Möglichkeit, dies ohne eval () zu erreichen?

Dies wird in einer db gespeichert, nicht in einer Datei. Byte Overhead ist wichtig, da es den Unterschied zwischen der Anforderung einer TEXT-Spalte und einer VARCHAR-Datei ausmachen kann. Die Datenkompaktheit wirkt sich in der Regel auf alle Bereiche der Db-Leistung aus.

    
ʞɔıu 10.02.2009, 16:03
quelle

7 Antworten

13

Sehen Sie sich json an, zumindest ist das generierte dumps mit vielen anderen Sprachen lesbar.

  

JSON (JavaScript-Objekt-Notation) Ссылка ist eine Teilmenge der JavaScript-Syntax (ECMA-262 3. Ausgabe), die als leichtgewichtiges Datenaustauschformat verwendet wird / p>

    
gimel 10.02.2009, 16:28
quelle
8

persönlich würde ich yaml verwenden. Es ist auf Augenhöhe mit JSON für die Kodierung der Größe, aber es kann bei Bedarf etwas komplexere Dinge (z. B. Klassen, rekursive Strukturen) darstellen.

%Vor%     
Autoplectic 10.02.2009 16:47
quelle
8

Vielleicht verwenden Sie nicht das richtige Protokoll:

%Vor%

Siehe die Dokumentation für Pickle-Datenformate .

    
Torsten Marek 10.02.2009 17:39
quelle
6

Wenn Sie eine platzsparende Lösung benötigen, können Sie Google-Protokollpuffer verwenden.

Protokollpuffer - Codierung

Protokollpuffer - Python-Lernprogramm

    
user41767 10.02.2009 17:14
quelle
1

In der Python-Dokumentation sind einige Persistenz-Builtins erwähnt, aber ich denke nicht, dass irgendetwas davon bemerkenswert ist kleiner in der produzierten Dateigröße.

Du könntest immer den configparser verwenden, aber dort bekommst du nur string, int, float, bool.

    
Sven Hecht 10.02.2009 16:15
quelle
0

"Der Byte-Overhead ist signifikant"

Warum ist das wichtig? Es macht den Job. Wenn Ihnen der Speicherplatz knapp wird, würde ich Ihnen gerne einen 1 TB für 500 $ verkaufen.

Hast du es ausgeführt? Ist Leistung ein Problem? Können Sie nachweisen, dass die Leistung der Serialisierung das Problem ist?

"Ich dachte daran, nur rep () und eval () zu verwenden, aber gibt es eine einfache Möglichkeit, dies ohne eval () zu erreichen?"

Nichts einfacher als Rep und Eval.

Was ist falsch mit eval?

Ist das "jemand könnte bösartigen Code in die Datei einfügen, wo ich meine Listen serialisiert habe" Problem?

Wer - speziell - wird diese Datei finden und bearbeiten, um bösartigen Code einzufügen? Alles, was Sie tun, um dies zu sichern (d. H. Verschlüsselung) entfernt "einfach" davon.

    
S.Lott 10.02.2009 16:15
quelle
-1

Zum Glück gibt es eine Lösung, die COMPRESSION verwendet und löst das allgemeine Problem mit einem beliebigen Python-Objekt einschließlich neuer Klassen. Eher als Micro-Management einfach Tupel Manchmal ist es besser, ein DRY-Tool zu verwenden.
Ihr Code wird klarer und leichter refaktoriert in ähnlichen zukünftigen Situationen.

y_serial.py module :: warehouse Python-Objekte mit SQLite

"Serialisierung + Persistenz: Komprimieren und kommentieren Sie in einigen Codezeilen Python-Objekte in SQLite und rufen sie später chronologisch nach Schlüsselwörtern ohne SQL ab. Am nützlichsten ist das" Standard "-Modul für eine Datenbank, um schemalose Daten zu speichern . "

Ссылка

[Wenn Sie immer noch besorgt sind, warum nicht stecken Sie diese Tupel ein ein Wörterbuch, wenden Sie dann y_serial auf das Wörterbuch an. Wahrscheinlich wird jeder Overhead aufgrund der Transparenz verschwinden Komprimierung im Hintergrund von zlib.]

Zur Lesbarkeit gibt die Dokumentation auch Details zu warum cPickle wurde über json ausgewählt.

    
code43 17.09.2009 08:09
quelle

Tags und Links