2017-01-08 4 views
1

J'ai écrit un script en Python en utilisant SciPy pour effectuer une transformation de Fourier de courte durée sur un signal. Quand je l'ai couru sur un signal avec un millier de points, ça s'est bien passé. Quand je l'ai exécuté sur un signal avec un million de points de temps, il a gelé mon ordinateur (l'ordinateur ne répond pas, et si l'audio était en train de jouer, l'ordinateur émet un saut et un bourdonnement en boucle); Cela a toujours eu lieu tous les trois fois que je l'ai essayé. J'ai écrit des scripts qui prendraient des heures, mais je n'en ai jamais rencontré un qui gelait réellement mon ordinateur. Une idée pourquoi? Le script est affiché ci-dessous:Pourquoi l'exécution de ce script gèle-t-elle mon ordinateur?

import scipy as sp 
from scipy import fftpack 

def STFT(signal, seconds_per_sample, window_seconds, min_Hz): 
    window_samples = int(window_seconds/seconds_per_sample) + 1 
    signal_samples = len(signal) 
    if signal_samples <= window_samples: 
     length = max(signal_samples, int(1/(seconds_per_sample*min_Hz)) + 1) 
     return sp.array([0]), fftpack.fftshift(fftpack.fftfreq(length, seconds_per_sample)), fftpack.fftshift(fftpack.fft(signal, n = length)) 
    else: 
     length = max(window_samples, int(1/(seconds_per_sample*min_Hz)) + 1) 
     frequency = fftpack.fftshift(fftpack.fftfreq(length, seconds_per_sample)) 
     time = [] 
     FTs = [] 
     for i in range(signal_samples - window_samples): 
      time.append(seconds_per_sample*i) 
      FTs.append(fftpack.fftshift(fftpack.fft(signal[i:i + window_samples], n = length))) 
     return sp.array(time), frequency, sp.array(FTs) 
+0

Est-ce que vous regardez sur la consommation de mémoire du script? Si c'est le cas, cela pourrait avoir des conséquences. – ondra

+0

Donc c'est un problème de mémoire principale épuisée? – BatWannaBe

+0

Le sp.array (FTs) résultant contiendrait de l'ordre de 10^12 flotteurs, après tout. – BatWannaBe

Répondre

-1

dans le script est consommé trop RAM lorsque vous l'exécutez sur un trop grand nombre de points, voir Why does a simple python script crash my system

Le processus que votre programme fonctionne stocke les tableaux et variables pour les calculs dans mémoire de processus qui est ram

Vous pouvez résoudre ce problème en forçant le programme à utiliser la mémoire du disque dur.

Pour des solutions de contournement (shelve, ...) voir les liens suivants

memory usage, how to free memory

Python large variable RAM usage

I need to free up RAM by storing a Python dictionary on the hard drive, not in RAM. Is it possible?

+0

Je suppose que je peux écrire la sortie de manière itérative dans un fichier .txt ou quelque chose. Toute idée de comment faire un tracé 3D itérativement, lol. – BatWannaBe