2017-09-23 3 views
0

J'ai beaucoup de dicts python avec un schéma connu. Par exemple, le schéma est défini comme pyspark StructType comme ceci:Comment sérialiser efficacement un dict python avec un schéma connu en binaire?

from pyspark.sql.types import * 
dict_schema = StructType([ 
     StructField("upload_time", TimestampType(), True),   
     StructField("name", StringType(), True), 
     StructField("value", StringType(), True), 
    ]) 

Je veux sérialisation efficacement chaque objet dict dans un tableau d'octets. Quelle méthode de sérialisation me donnera la plus petite charge utile? Je ne veux pas utiliser pickle parce que la charge utile est très grande (son schéma incorporé dans chaque objet sérialisé).

Merci,

Répondre

0

Vous pouvez utiliser le module struct intégré. Il suffit de « pack » les valeurs suivantes:

import struct 
struct.pack('Q10s5s`, time, name, value) 

C'est en supposant le temps est un entier de 64 bits, le nom est au plus 10 caractères et la valeur est au plus 20 caractères. Vous devrez l'accorder. Vous pouvez également envisager de stocker les chaînes comme des séquences d'octets à terminaison nulle si les noms et les valeurs n'ont pas de longueurs cohérentes (vous ne voulez pas perdre de place sur le remplissage).

Une autre bonne façon utilise NumPy, en supposant que les chaînes ont des longueurs assez cohérentes:

import numpy as np 
a = np.empty(1000, [('time', 'u8'), ('name', 'S10'), ('value', 'S20')]) 
np.save(filename, a) 

Cela comprendra un « schéma » en quelque sorte en haut du fichier; vous pouvez écrire le tableau brut sans ce schéma si vous le voulez vraiment.