2015-11-13 89 views
0

的窗口,我在Python新手計算功能。我有一個18 GB和4800萬條記錄的巨大csv文件。每個記錄都是37維矢量,記錄在〜1700Hz。我正在嘗試使用this approach在其上應用滑動窗口。並且對於每個窗口,我正在計算簡單的meanvariance。對於較小規模的數據,這很好。但是,一旦我試圖通過我的實際文件計算它,它會花費很長時間。我使用下面的代碼:快速的方式在滑動巨大的csv文件

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建議我改變了我的數據結構從listdeque,現在它正在爲下一個Windows爲好。我認爲在循環中讀取每一行並放入deque是昂貴的。無論如何要一次讀取文件塊?

+0

你會通過讀取更大的塊中的文件,將那些numpy的陣列,然後計算這些陣列的子集的總結得到這種任務的最佳性能(你會保持在單個存儲單元中的數據通過這個)。 – liborm

+0

@liborm是的,我認爲閱讀一條線需要花費太多時間。我查閱了大量文件,但失敗了。你有沒有與此相關的資源? – Muaz

+0

這不是閱讀,而是分別處理每一行,導致它慢。您可以閱讀說5 MB的數據的時間,然後使用類似[熊貓](http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments)來計算統計,然後閱讀下一個塊佔重疊,沖洗和重複。 – liborm

回答

0

你的問題是與您的L類:

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

這確實從列表中刪除第一個元素,但是在Python從列表中刪除是O(n)的操作。由於您從前面移除,這意味着每次執行此操作時,列表都必須移動max_list_size個元素。解決這個問題

最簡單的方法是隻使用一個deque代替L。就像你說的,它有一個maxlen屬性,它可以做你想做的。 numpy.meannumpy.var將正常工作與deque,所以你甚至不需要更改任何其他代碼。

+0

感謝您的建議,請參閱最新的問題。 – Muaz