2016-06-26 9 views
1

У меня есть много файлов .mat, которые содержат информацию о радиальной части некоторых различных волновых функций и некоторой другой информации об атоме. Теперь я успешно извлек часть волновой функции и использовал numpy.savetxt(), чтобы сохранить ее в .txt-файл. Но размер файла увеличивается так: После того как я побежалРазмер файла увеличивается после преобразования из файлов .mat в файлы .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 

Игнорируйте L = 11 и L = 12 разница, размер волновых функций почти одинаковы, но размер файла увеличился более чем 6 раз. Я хочу знать причину и, возможно, способ уменьшить размер .txt-файлов. Вот код, как я тайные файлы:

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)) 

и формат файл данных, необходимого это:

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 

Если вам нужна дополнительная информация, не стесняйтесь спрашивать! Заранее спасибо.

+1

В зависимости от того, как вы их сохранили, может быть просто изменение типа данных. Можете ли вы добавить код, используемый для чтения/сохранения? – Benjamin

+0

mat-Files являются двоичными и сжатыми, а файлы txt - ohm, text, поэтому коэффициент 3-6 вполне нормальный. Если размер имеет значение, используйте двоичный формат, например .mat. – Daniel

+0

Этого можно ожидать. Текстовые файлы преобразуют числа, представленные в двоичном виде в символы.Тривиальный упрощенный пример: номер 2 может быть представлен двумя битами '10' в двоичном формате, символ« 2 »- шестнадцатеричный. 32, это восемь двоичных бит (в ASCII), поэтому в 4 раза больше (в Unicode это будет 16 бит). Одним из способов сокращения является zip (сжатие) txt-файла - для этого доступно несколько модулей python, но вам нужно распаковать его для использования. Уменьшение размера зависит от данных. – cdarke

ответ

3

.mat - это двоичный формат, тогда как numpy.savetxt() пишет простой текстовый файл. Бинарное представление числа двойной точности (двойная точность IEEE 754) занимает 8 байтов. По умолчанию numpy сохраняет это как обычный текст в формате 0.000000000000000000e+00, что приводит к 24 байтам.

Существует ряд дополнительных эффектов, которые влияют на результирующий размер файла. Например. структурные издержки формата файла, сжатие, формат, который вы используете для написания обычного текста (число десятичных цифр). Однако в вашем случае я подозреваю, что основной эффект - это просто разница между двоичным и простым текстовым представлением чисел.

Если вы хотите уменьшить размер файла, вы должны использовать другой формат вывода. Возможные варианты:

  • написать архивный текстовый файл:

    import gzip 
    with open('data.txt.gz', 'wb') as f: 
        numpy.savetxt(f, myarray) 
    
  • Сохранить как .mat снова. См. scipy.io.savemat()

  • Напишите фирменный формат двоичного numpy (.npy). См. numpy.save()
  • Запишите собственный двоичный сжатый формат numpy (.npz). См. numpy.savez_compressed()
  • Если у вас очень много структурированных данных, рассмотрите вопрос об использовании HDF5 file format.
  • Если вам нужно написать свой собственный двоичный формат, используйте struct.pack() и напишите полученные байты в файл.

Какой вариант выбрать, зависит от вашей ситуации: кому придется читать данные после этого? Насколько важен коэффициент сжатия? Являются ли ваши данные только одним единственным массивом или сложнее структура?

+0

Знаете ли вы, как сохранять данные также в двоичном формате? –

+0

Что именно вы имеете в виду? Варианты 2-5 ('.mat',' .npy', '.npz',' .hdf5') - все двоичные форматы. Они просто отличаются структурированием данных и сжатием. –

+0

Спасибо за ответ. После обработки файлов они будут прочитаны программой на C++ для дальнейших вычислений. В программе на C++ данные должны быть в формате массива 2 на N (конечно, сами файлы данных сохраняются в формате двух столбцов). Я хочу знать, можно ли сохранить данные, например, .mat снова, чтобы уменьшить размер файлов? –

 Смежные вопросы

  • Нет связанных вопросов^_^