快速计算巨大csv文件滑动窗口特征的方法

时间:2015-11-13 18:52:37

标签: python csv feature-extraction

我是Python的新手。我有一个18 GB的巨大csv文件和4800万条记录。每个记录都是37维向量,以~1700 Hz记录。我想要做的是使用this approach在它上面应用一个滑动窗口。对于每个窗口,我正在计算该数据的简单meanvariance。对于较小的数据,它很好。但是,一旦我试图通过我的实际文件计算它,它需要很长时间。我使用以下代码:

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是很昂贵的。无论如何都要一次读取文件块?

1 个答案:

答案 0 :(得分:1)

您的问题与您的班级L

有关
    if len(self) > max_list_size: self[:1]=[]

这确实从列表中删除了第一个元素,但在python中从列表中删除是O(n)操作。由于您从前面删除,这意味着每次执行此操作时列表都必须移动max_list_size个元素。

解决此问题的最简单方法是使用deque代替L。就像你说的那样,它有一个maxlen属性可以满足您的需求。 numpy.meannumpy.var可以使用deque正常工作,因此您甚至无需更改任何其他代码。