J'ai un problème (avec ma RAM) ici : elle n'est pas capable de contenir les données que je veux tracer. J'ai suffisamment d'espace HD. Y a-t-il une solution pour éviter cette "ombre" de mon jeu de données ?
Concrètement, je travaille sur le traitement numérique du signal et je dois utiliser un taux d'échantillonnage élevé. Mon framework (GNU Radio) enregistre les valeurs (pour éviter d'utiliser trop d'espace disque) en binaire. Je le décompresse. Ensuite, j'ai besoin de les tracer. J'ai besoin que le tracé soit zoomable et interactif. Et c'est un problème.
Y a-t-il un potentiel d'optimisation à cela, ou un autre logiciel/langage de programmation (comme R ou autre) qui peut gérer des ensembles de données plus importants ? En fait, je veux beaucoup plus de données dans mes tracés. Mais je n'ai pas d'expérience avec d'autres logiciels. Gnuplot échoue, avec une approche similaire à la suivante. Je ne connais pas R (encore).
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import struct
"""
trace un fichier c
fichier c - valeurs en virgule flottante (4 octets), paires IQ, binaire
txt - index, en phase, en quadrature en texte brut
note : tracer directement avec numpy donne des fonctions ombrées
"""
# décompactage de l'ensemble de données du fichier c
def unpack_set(input_filename, output_filename):
index = 0 # index des échantillons
output_filename = open(output_filename, 'wb')
with open(input_filename, "rb") as f:
byte = f.read(4) # lire la 1ère colonne du vecteur
while byte != "":
# Valeurs stockées sur Bit
floati = struct.unpack('f', byte) # écrire la valeur de la 1ère colonne dans une variable
byte = f.read(4) # lire la 2ème colonne du vecteur
floatq = struct.unpack('f', byte) # écrire la valeur de la 2ème colonne dans une variable
byte = f.read(4) # ligne suivante du vecteur et lire la 1ère colonne
# format délimiteur pour matplotlib
lines = ["%d," % index, format(floati), ",", format(floatq), "\n"]
output_filename.writelines(lines)
index = index + 1
output_filename.close
return output_filename.name
# reformate la sortie (configuration de précision ici)
def format(value):
return "%.8f" % value
# démarrage
def main():
# spécifier le chemin
fichier_decompacte = unpack_set("test01.cfile", "test01.txt")
# passer la référence du fichier à matplotlib
nom_fichier = str(fichier_decompacte)
plt.plotfile(nom_fichier, cols=(0,1)) # index vs. en phase
# facultatif
# plt.axes([0, 0.5, 0, 100000]) # pour 100k échantillons
plt.grid(True)
plt.title("Diagramme du signal")
plt.xlabel("Échantillon")
plt.ylabel("En Phase")
plt.show();
if __name__ == "__main__":
main()
Quelque chose comme plt.swap_on_disk() pourrait mettre en cache les données sur mon SSD ;)