【发布时间】:2016-02-15 10:55:50
【问题描述】:
我是 Python 的新手。我有一个 18 GB 和 4800 万条记录的巨大 csv 文件。每条记录都是 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 是昂贵的。有没有一次读取大块文件?
【问题讨论】:
-
通过读取更大块的文件,将这些文件转换为 numpy 数组,然后计算这些数组的子集的摘要,您将获得此类任务的最佳性能(您将保留数据通过这个在单个内存位置)。
-
@liborm 是的,我认为阅读一行需要太多时间。我查找以块为单位读取文件但失败了。你有相关的资源吗?
-
这不是阅读,而是单独处理每一行导致它变慢的原因。您可以一次读取 5 MB 的数据,然后使用 pandas 之类的东西来计算统计数据,然后读取考虑重叠的下一个块,冲洗并重复。
标签: python csv feature-extraction