【问题标题】:Fast way to calculate feature on sliding window of huge csv file计算大型 csv 文件滑动窗口特征的快速方法
【发布时间】:2016-02-15 10:55:50
【问题描述】:

我是 Python 的新手。我有一个 18 GB 和 4800 万条记录的巨大 csv 文件。每条记录都是 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 是昂贵的。有没有一次读取大块文件?

【问题讨论】:

  • 通过读取更大块的文件,将这些文件转换为 numpy 数组,然后计算这些数组的子集的摘要,您将获得此类任务的最佳性能(您将保留数据通过这个在单个内存位置)。
  • @liborm 是的,我认为阅读一行需要太多时间。我查找以块为单位读取文件但失败了。你有相关的资源吗?
  • 这不是阅读,而是单独处理每一行导致它变慢的原因。您可以一次读取 5 MB 的数据,然后使用 pandas 之类的东西来计算统计数据,然后读取考虑重叠的下一个块,冲洗并重复。

标签: python csv feature-extraction


【解决方案1】:

你的问题在于你的班级L

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

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

解决此问题的最简单方法是使用deque 而不是L。就像你说的,它有一个 maxlen 属性,可以满足你的需求。 numpy.meannumpy.var 可以很好地与 deque 配合使用,因此您甚至不需要更改任何其他代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2018-06-05
    • 2017-03-12
    • 2018-08-27
    • 2017-01-16
    • 2018-12-09
    • 2021-07-01
    相关资源
    最近更新 更多