2016-06-26 2 views
1

J'ai beaucoup de fichiers .mat qui contiennent des informations sur la partie radiale de certaines fonctions d'onde et d'autres informations sur un atome. Maintenant, j'ai réussi à extraire la partie wavefunction et à utiliser numpy.savetxt() pour l'enregistrer dans un fichier .txt. Mais la taille du fichier augmente tellement: Après avoir couruLa taille du fichier augmente après la conversion de fichiers .mat en fichiers .txt

du -ch wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat 
    440K wfkt_X_rb87_n=40_L=11_J=0_step=0.001.mat 
    du -ch wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt 
    2,9M wfkt_X_rb87_n=40_L=12_J=0_step=0.001.txt 

Ignore L = 11 et L = 12 différence, la taille des fonctions d'onde sont presque les mêmes, mais la taille du fichier a augmenté de plus de 6 fois. Je veux savoir la raison et probablement un moyen de diminuer la taille des fichiers .txt. Voici le code que je Covert les fichiers:

import scipy.io as sio 
    import os 
    import pickle 
    import numpy as np 
    import glob as gb 
    files=gb.glob('wfkt_X_rb*.mat') 
    for filet in files: 
      print filet 
      mat=sio.loadmat(filet) 
      wave=mat['wavefunction'][0] 
      J=mat['J'] 
      L=mat['L'] 
      n=mat['n'] 
      xmax=mat['xmax'][0][0] 
      xmin=mat['xmin'][0][0] 
      xstep=mat['xstep'][0][0] 
      energy=mat['energy'][0][0] 
      name=filet.replace('.mat','.txt') 
      name=name.replace('rb','Rb') 
      x=np.linspace(xmin, xmax, num=len(wave), endpoint=False) 
      Data=np.transpose([x,wave]) 
      np.savetxt(name,Data) 
      os.remove(filet) 
      with open(name, "a") as f: 
        f.write(str(energy)+" "+str(xstep)+"\n") 
        f.write(str(xmin)+" "+str(xmax)) 

et le format du fichier de données nécessaires est:

2.700000000000000000e+01 6.226655250941872093e-04 
    2.700099997457605738e+01 6.232789496263042460e-04 
    2.700199994915211121e+01 6.238928333406641843e-04 
    2.700299992372816860e+01 6.245071764542571872e-04 
    2.700399989830422243e+01 6.251219791839867897e-04 
    2.700499987288027981e+01 6.257372417466700075e-04 
    2.700599984745633364e+01 6.263529643590372287e-04 

Si vous avez besoin de plus amples informations, ne hésitez pas à demander! Merci d'avance.

+1

Selon la façon dont vous les avez sauvegardés, il peut s'agir simplement d'un changement de type de données. Pouvez-vous ajouter le code utilisé pour les lire/les sauvegarder? – Benjamin

+0

mat-Files sont binaires, et compressés, et les fichiers txt sont, ohm, du texte, donc un facteur de 3 à 6 est tout à fait normal. Si la taille est importante, utilisez un format binaire comme .mat. – Daniel

+0

C'est à prévoir. Les fichiers texte convertissent les nombres représentés en binaire en caractères.Un exemple trivial simpliste: le nombre 2 peut être représenté par deux bits '10' en binaire, le caractère" 2 "est hexadécimal. 32, c'est huit bits binaires (en ASCII), donc 4 fois plus gros (en Unicode ce serait 16 bits). Une façon de réduire est de compresser le fichier txt - il y a un certain nombre de modules python disponibles pour cela, mais vous devez le décompresser pour utiliser le fichier. La réduction de taille dépendra des données. – cdarke

Répondre

3

.mat est un format binaire tandis que numpy.savetxt() écrit un fichier texte brut. La représentation binaire d'un nombre double précision (double précision IEEE 754) prend 8 octets. Par défaut, numpy enregistre cela sous forme de texte au format 0.000000000000000000e+00 résultant en 24 octets.

Un certain nombre d'effets supplémentaires affectent la taille du fichier résultant. Par exemple. surcharge structurelle du format de fichier, compression, le format que vous utilisez pour l'écriture du texte brut (nombre de chiffres décimaux). Cependant, dans votre cas, je soupçonne que l'effet principal est juste la différence entre une représentation binaire et une représentation en texte brut des nombres.

Si vous souhaitez réduire la taille du fichier, vous devez utiliser un format de sortie différent. Les options possibles sont:

  • écrire un fichier texte compressé:

    import gzip 
    with open('data.txt.gz', 'wb') as f: 
        numpy.savetxt(f, myarray) 
    
  • Enregistrer sous .mat à nouveau. Voir scipy.io.savemat()

  • Ecrivez un format binaire numpy propriétaire (.npy). Voir numpy.save()
  • Ecrivez un format binaire compressé binaire propriétaire (.npz). Voir numpy.savez_compressed()
  • Si vous avez de très grandes quantités de données structurées, pensez à utiliser le HDF5 file format.
  • Si vous devez écrire votre propre format binaire, utilisez struct.pack() et écrivez les octets résultants dans un fichier.

Quelle option choisir dépend de votre situation: Qui devra lire les données par la suite? Quelle est l'importance du facteur de compression? Vos données ne sont-elles qu'un seul tableau ou la structure est-elle plus complexe?

+0

Savez-vous comment enregistrer les données également au format binaire? –

+0

Que voulez-vous dire exactement? Les options 2-5 ('.mat',' .npy', '.npz',' .hdf5') sont tous des formats binaires. Ils diffèrent simplement par la structuration des données et la compression. –

+0

Merci pour la réponse. Après avoir traité les fichiers, ils seront lus par un programme C++ pour faire d'autres calculs. Dans le programme C++, les données doivent être au format 2 par N (bien sûr, les fichiers de données eux-mêmes sont sauvegardés dans le format de deux colonnes). Je veux savoir si c'est possible en sauvegardant les données dans, par exemple, .mat à nouveau pour réduire la taille des fichiers? –