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

Fast way to calculate feature on sliding window of huge csv file

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

这个code is to subclass the list, to add functionality like 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)

这是读取文件并计算每个 window

的特征
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)

首先计算 window 花了 5 分钟来响应均值和方差。但它从未响应 2nd window。我没有弄错我在做什么。我也尝试查看互联网,但我认为我发现方向错误。

编辑

按照@Omada 的建议,我将数据结构从 list 更改为 deque,现在它也适用于下一个 windows。我认为循环读取每一行并放入 deque 是昂贵的。有没有办法一次读取一大块文件?

您的问题出在您的 class L:

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

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

解决此问题的最简单方法是使用 deque 而不是 L。正如您所说,它有一个 maxlen 属性 可以满足您的需求。 numpy.meannumpy.var 将与 deque 一起正常工作,因此您甚至不需要更改任何其他代码。