我有一个长度为 1e8 的一维时间序列(100,000,000 个元素)。这是我在 Dropbox 上使用的数据的链接。(文件大小为 382 MB。)
更新
基于memory_profiling,错误出现在该行
data[absolute(data-dc)< m*std(data)]=dc.
更具体地说,该操作absolute(data-dc)
耗尽了所有内存。Data
如上所述,dc
是一个常数。也许这是一个微妙的语法错误?
我想从中删除异常值和伪影,并用中位数替换这些值。我尝试使用以下功能来做到这一点。
from numpy import *
from sys import argv
from scipy.io import savemat
from scipy.stats import scoreatpercentile
def reject_outliers(data,dc,m=3):
data[data==0] = dc
data[bp.absolute(data-dc) < m*np.std(data)] = dc
return data
def butter_bandpass(lowcut,highcut,fs,order=8):
nyq = 0.5*fs
low = lowcut/nyq
high = highcut/nyq
b,a= butter(order, [low, high], btype='band')
return b,a
def butter_bandpass_filter(data,lowcut,highcut,fs,order=8):
b,a = butter_bandpass(lowcut,highcut,fs,order=order)
return lfilter(b,a,data)
OFFSET = 432
filename = argv[1]
outname = argv[2]
print 'Opening '+ filename
with open(filename,'rb') as stream:
stream.seek(OFFSET)
data=fromfile(stream,dtype='int16')
print 'Removing Artifacts, accounting for zero-filling'
dc = median(data)
data = reject_outliers(data,dc)
threshold = scoreatpercentile(absolute(data),85)
print 'Filtering and Detrending'
data = butter_bandpass_filter(data,300,7000,20000)
savemat(outname+'.mat',mdict={'data':data})
在一个文件上调用它会占用 4 GB 的 RAM 和 3 GB 的虚拟内存。我确定这是该函数的第二行,因为我单步执行了我编写的脚本并且它总是挂在这部分。我什至可以看到(在 OS X 上的 Finder 中)可用硬盘空间一秒一秒地下降。
时间序列不足以解释它。第二行有什么问题reject-outliers
?