Почему запуск этого скрипта зависает на моем компьютере?

Я написал скрипт на Python, используя SciPy для выполнения кратковременного преобразования Фурье сигнала. Когда я запускал его на сигнале с тысячей временных точек, он работал нормально. Когда я запускал его на сигнале с миллионом временных точек, мой компьютер зависал (компьютер не отвечал, и если звук воспроизводился, компьютер выдавал пропуски и зацикливания); это постоянно происходило все три раза, когда я пытался это сделать. Я писал сценарии, которые занимали бы часы, но я никогда не сталкивался с таким, который фактически зависал бы на моем компьютере. Есть идеи, почему? Скрипт размещен ниже:

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)

person BatWannaBe    schedule 08.01.2017    source источник
comment
Вы смотрели на потребление памяти скриптом? Если он выполняет интенсивное распределение, это может иметь следующие последствия.   -  person ondra    schedule 08.01.2017
comment
Так это проблема исчерпания основной памяти?   -  person BatWannaBe    schedule 08.01.2017
comment
В конце концов, результирующий массив sp.array(FT) будет содержать порядка 10^12 поплавков.   -  person BatWannaBe    schedule 08.01.2017
comment
Не знаю, но вполне может быть. Посмотрите на некоторые статистические данные ОС, когда скрипт работает, и вы должны увидеть.   -  person ondra    schedule 08.01.2017
comment
Похоже, дело в этом. У моего компьютера ~ 12 ГБ ОЗУ, а 10 ^ 12 float64 займут не менее 8 ТБ.   -  person BatWannaBe    schedule 08.01.2017


Ответы (1)


в сценарии потребляется слишком много оперативной памяти, когда вы запускаете его по слишком большому количеству точек, см. Почему простой скрипт Python приводит к сбою моей системы

Процесс, в котором работает ваша программа, сохраняет массивы и переменные для вычислений в памяти процесса, которая является оперативной памятью.

вы можете исправить это, заставив программу использовать память жесткого диска.

Обходные пути (shelve,...) см. по следующим ссылкам.

использование памяти, как освободить память

Использование большой переменной ОЗУ Python

Мне нужно освободить оперативную память, сохранив словарь Python на жестком диске, а не в оперативной памяти. Возможно ли это?

person ralf htp    schedule 08.01.2017
comment
Думаю, я могу итеративно записывать вывод в файл .txt или что-то в этом роде. Любая идея, как сделать 3D-график итеративно, лол. - person BatWannaBe; 08.01.2017