在Ubuntu但运行matpplotlib的specgram命令时,不能在Windows的Pytho

2019-10-29 07:18发布

我会真诚地感谢与下面请您帮助:

我试图运行一些Python代码(使用IPython的,Python版本2.7.3),我在双启动笔记本电脑( - Ubuntu的LTS 12.04,64位和MS Windows 7 64位)。 在Windows上运行的代码工作正常,但由于某些原因使我的内存错误在Ubuntu。 我不知道这是一个Python的问题或OS的问题。 我会坚持与运行在MS Windows的代码,但具有我挣扎着它自己的问题,包括导入库等,它们运行在Ubuntu的代码时,我没有。

该代码是相当简单的。 作为参考,我有一个大的二进制文件,其表示从在实验室3个通道16张带符号的数。 仪器。 数据是在10 MS / s的采样。 该文件是〜1.G千兆字节表示大约25秒内的数据。 在下面的代码我在数据进入“数据”读,现在想使用Matplotlib的specgram功能绘制谱图。 这部分在Windows而不是Ubuntu的正常工作。

一些代码...

import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
file = "data_stream.srm"
with open(file,'rb') as fd:
fd.seek(0)
data = np.fromfile(fd,dtype=[('ch0','<i2'),('ch1','<i2'),('ch2','<i2')]) 

数据内容(原始信号值)如下所示:

array([(-1, 5, -3), (-4, 3, -4), (-6, 0, -3), ..., (-1, -2, 0),
   (-2, -1, -2), (-2, -2, -1)], 
  dtype=[('ch0', '<i2'), ('ch1', '<i2'), ('ch2', '<i2')])

也许不是最好的方式做到这一点,但它工作得很好了这里(在两个Ubuntu和Windows)中。 (使用data.shape)数据的大小给予(261144000)。 本来期望看到的形状为(261144000,3),因为这大量是行数(并因此值的数目),用于其中有3例如打字每个信道:

len(data'ch0']) 

返回,261144000

接下来的问题是使用matplotlib的specgram功能频谱

   specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none,
    window=mlab.window_hanning, noverlap=128,
    cmap=None, xextent=None, pad_to=None, sides='default',
    scale_by_freq=None, **kwargs)

一些代码...

ADCR = 12        # ADC Resolution in bits
    VOLT = 5.0       # Voltage range
    SF = VOLT/(2**ADCR)  # scaling factor to convert raw ADC values to volts  

    w_length= 512 
    nFFT=2 * w_length
    n_overlap=np.fix(w_length/2)
    p_to = 4 *w_length
    cmap=plt.cm.seismic
    Fs = 10E6 # Sampling Frequency
    fig=plt.figure()
    ax=fig.add_subplot(111)
    Pxx, freqs, bins,im =    


plt.specgram((data['ch1'])*SF,NFFT=nFFT,Fs=Fs,noverlap=n_overlap,pad_to=p_to,cmap=cmap)

运行最后一条命令工作在Windows,但不是Ubuntu Linux系统。 我得到了以下信息:

内存错误......“因为我需要10的声誉后不能张贴图片”

MemoryError                               Traceback (most recent call last)
/media/IomegaHDD/<ipython-input-28-5144fe0c6918> in <module>()
----> 1 Pxx, freqs, bins, im = plt.specgram((data['ch1'])*SF,NFFT=nFFT,Fs=Fs,detrend=mlab.detrend_linear,noverlap=n_overlap,pad_to=p_to,scale_by_freq=True,cmap=cmap)

/usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc in specgram(x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, hold, **kwargs)
   2609         ax.hold(hold)
   2610     try:
-> 2611         ret = ax.specgram(x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, **kwargs)
   2612         draw_if_interactive()
   2613     finally:

/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in specgram(self, x, NFFT, Fs, Fc, detrend, window, noverlap, cmap, xextent, pad_to, sides, scale_by_freq, **kwargs)
   8146 
   8147         Pxx, freqs, bins = mlab.specgram(x, NFFT, Fs, detrend,
-> 8148              window, noverlap, pad_to, sides, scale_by_freq)
   8149 
   8150         Z = 10. * np.log10(Pxx)

/usr/lib/pymodules/python2.7/matplotlib/mlab.pyc in specgram(x, NFFT, Fs, detrend, window, noverlap, pad_to, sides, scale_by_freq)
    458 
    459     Pxx, freqs, t = _spectral_helper(x, x, NFFT, Fs, detrend, window,
--> 460         noverlap, pad_to, sides, scale_by_freq)
    461     Pxx = Pxx.real #Needed since helper implements generically
    462 

/usr/lib/pymodules/python2.7/matplotlib/mlab.pyc in _spectral_helper(x, y, NFFT, Fs, detrend, window, noverlap, pad_to, sides, scale_by_freq)
    256     ind = np.arange(0, len(x) - NFFT + 1, step)
    257     n = len(ind)
--> 258     Pxy = np.zeros((numFreqs, n), np.complex_)
    259 
    260     # do the ffts of the slices


MemoryError: 

正如我说,也许这是一个Ubuntu的问题,我不知道,因为我没有得到在Windows上运行的代码这个问题。 然而,这有它自己的代码的其他后续部分的问题。

您的援助将不胜感激。

谢谢。

问候,

将。

Answer 1:

你确定你正在运行的32位Ubuntu发行版? 你还必须有蟒蛇运行64位版本太多。

如果是这样的问题,它的下跌的事实,32位操作系统(和程序)不能应对大内存块是64个系统可以。

要知道,如果你有64位Linux上运行(在Ubuntu)

$ uname -a

并查找

  • x86_64 GNU/Linux - 64位
  • ia64 GNU/Linux - 64位
  • i386 GNU/Linux - 32位

要看到,如果你有一个32位的蟒蛇可执行文件,检查出

$ file -L `which python`

并寻找出64S,32S构成。



文章来源: Python MemoryError issue on Ubuntu but not on windows when running matpplotlib's specgram command