我真诚地感谢您对以下方面的帮助:
我试图在双启动笔记本电脑上运行一些python代码(使用Ipython,Python版本2.7.3)( - Ubuntu 12.04 LTS,64位和MS Windows 7 64位)。在Windows中运行代码工作正常,但由于某种原因在Ubuntu中给我内存错误。我不确定这是python问题还是操作系统问题。我会坚持在MS窗口上运行代码,但这有自己的问题,我正在努力,包括导入库等,这是我在Ubuntu中运行代码时没有的。
代码相当直接。作为参考,我有一个大的二进制文件,它代表实验室中3个通道的16位带符号数。仪器。数据以10MS / s进行采样。该文件是~1.G Gbytes,代表大约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。我收到以下消息:
内存错误...“无法发布图片,因为我需要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中运行代码时没有遇到此问题。然而,这与代码的其他后续部分有关。
非常感谢您的协助。
谢谢。
此致
威尔
答案 0 :(得分:0)
您确定要运行32位Ubuntu发行版吗?您还必须运行64位版本的python。
如果这是问题,那就是32位操作系统(和程序)无法处理64位系统可以处理的大内存块这一事实。
告诉你是否有64位Linux,运行(在Ubuntu中)
$ uname -a
并寻找
x86_64 GNU/Linux
- 64位ia64 GNU/Linux
- 64位i386 GNU/Linux
- 32位要查看您是否有32位python可执行文件,请查看
$ file -L `which python`
并留意64s或32s。