我是Python的新手。我有一个18 GB的巨大csv文件和4800万条记录。每个记录都是37维向量,以~1700 Hz记录。我想要做的是使用this approach在它上面应用一个滑动窗口。对于每个窗口,我正在计算该数据的简单mean
和variance
。对于较小的数据,它很好。但是,一旦我试图通过我的实际文件计算它,它需要很长时间。我使用以下代码:
此code是列表的子类,以添加deque.maxlen
等功能max_list_size = 3015000 # for samples in 30 mins
sliding_factor = 1005000 # for samples in 10 mins
class L(list):
def append(self, item):
global max_list_size
list.append(self, item)
if len(self) > max_list_size: self[:1]=[]
此功能用于计算列表中的均值和方差
def calc_feature(mylist):
print 'mean is ', numpy.mean(mylist)
print 'variance is ', numpy.var(mylist)
这是每个窗口的读取文件和计算功能
def read_mycsv (csv_filepath):
global max_list_size, sliding_factor
mylist = L()
with open(csv_filepath,"rb") as f:
reader = csv.reader(f)
for _ in range(max_list_size):
mylist.append(map(float,reader.next())) # filling records in list
try:
while 1:
calc_feature(mylist)
for _ in range(sliding_factor):
mylist.append(map(float,reader.next()))
except StopIteration:
calc_feature(mylist)
对于计算第一个窗口,需要5分钟来响应均值和方差。但它从来没有回应过第二个窗口。我没有弄到我做错了什么。我试图查看互联网,但我认为我发现方向错误。
修改
根据@Omada的建议,我将数据结构从list
更改为deque
,现在它也适用于下一个窗口。我认为在循环中读取每一行并放入deque
是很昂贵的。无论如何都要一次读取文件块?
答案 0 :(得分:1)
您的问题与您的班级L
:
if len(self) > max_list_size: self[:1]=[]
这确实从列表中删除了第一个元素,但在python中从列表中删除是O(n)操作。由于您从前面删除,这意味着每次执行此操作时列表都必须移动max_list_size
个元素。
解决此问题的最简单方法是使用deque
代替L
。就像你说的那样,它有一个maxlen
属性可以满足您的需求。 numpy.mean
和numpy.var
可以使用deque
正常工作,因此您甚至无需更改任何其他代码。