快速计算巨大 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,我正在计算该数据的简单 mean
和 variance
。对于较小的数据,这很好。但是一旦我尝试根据我的实际文件计算它就需要很长时间。我正在使用以下代码:
这个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.mean
和 numpy.var
将与 deque
一起正常工作,因此您甚至不需要更改任何其他代码。
我是Python的新手。我有一个 18 GB 和 4800 万条记录的巨大 csv 文件。每条记录都是 37 维向量,以~1700 Hz 记录。我想做的是使用 this approach 在其上应用滑动 window。对于每个 window,我正在计算该数据的简单 mean
和 variance
。对于较小的数据,这很好。但是一旦我尝试根据我的实际文件计算它就需要很长时间。我正在使用以下代码:
这个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.mean
和 numpy.var
将与 deque
一起正常工作,因此您甚至不需要更改任何其他代码。