【问题标题】:Why does running this script freeze my computer?为什么运行此脚本会冻结我的计算机?
【发布时间】:2017-05-22 17:04:36
【问题描述】:

我使用 SciPy 在 Python 中编写了一个脚本来对信号执行短时傅立叶变换。当我在具有一千个时间点的信号上运行它时,它运行良好。当我在具有一百万个时间点的信号上运行它时,它冻结了我的计算机(计算机没有响应,如果正在播放音频,计算机会输出跳跃和循环的嗡嗡声);这一直发生在我尝试的所有 3 次。我编写的脚本需要花费数小时,但我从未遇到过真正冻结我的计算机的脚本。知道为什么吗?脚本贴在下面:

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)

【问题讨论】:

  • 看脚本的内存消耗了吗?如果它进行大量分配,它可能会产生这些后果。
  • 所以是主存耗尽的问题?
  • 生成的 sp.array(FTs) 毕竟包含大约 10^12 个浮点数。
  • 我不知道,但很可能是这样。查看脚本运行时的一些操作系统统计信息,您应该会看到。
  • 似乎就是这个问题。我的电脑有大约 12 GB 的 RAM,10^12 个 float64 将占用至少 8 TB。

标签: python scipy freeze fftpack


【解决方案1】:

当您在过多的点上运行脚本时,会消耗过多的 RAM,请参阅 Why does a simple python script crash my system

您的程序运行的进程将用于计算的数组和变量存储在 进程内存 内存中

您可以通过强制程序使用硬盘内存来解决此问题。

有关解决方法 (shelve,...),请参阅以下链接

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?

【讨论】:

  • 我想我可以将输出迭代地写入 .txt 文件或其他东西。知道如何迭代地制作 3D 图,哈哈。
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 2020-01-03
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多