2012-11-15 36 views
6

我對python和編程一般都很陌生,但我試圖在包含大約7百萬行python的製表符分隔的.txt文件上運行「滑動窗口」計算。滑動窗口的意思是它將運行超過50,000條線的計算,報告數字,然後向上移動10,000條線,並在另外50,000條線上執行相同的計算。我有計算和「滑動窗口」工作正常,它運行良好,如果我測試一小部分我的數據。但是,如果我嘗試在整個數據集上運行該程序,它非常慢(我已經運行了大約40個小時)。數學很簡單,所以我認爲它不應該花這麼長時間。在Python中有效地處理一個大的.txt文件

我正在閱讀我的.txt文件的方式是使用csv.DictReader模塊。我的代碼如下:

file1='/Users/Shared/SmallSetbee.txt' 
newfile=open(file1, 'rb') 
reader=csv.DictReader((line.replace('\0','') for line in newfile), delimiter="\t") 

我認爲,這是製作出來的字典全部7個萬行的一次,我在想可能是它會減慢這麼多的大文件的原因。

因爲我只關心一次對數據的「塊」或「窗口」進行計算,是否有一種更有效的方法來一次只讀取指定的行,執行計算,然後重複指定行的新指定「塊」或「窗口」?

+1

這不會一次製作所有行的字典。它爲每一行製作一本字典。這意味着你發佈的片段並不是你的表現困境的原因。也許你可以向我們展示更多的代碼? –

+1

我懷疑如果你正在計算大量表格式的數據,你可能想看看熊貓:http://pandas.pydata.org/pandas-docs/dev/io.html#iterating-through-文件逐塊大小您嘗試執行的所有操作可能已經完成1000次以上。 – Iguananaut

+0

您將在696個「窗口」上運行此計算。 50k行文件上的單個窗口需要多長時間? –

回答

6

A collections.deque是可以採取最大尺寸的項目的有序集合。當你添加一個項目到一端,一個落在另一端。這意味着要遍歷csv上的「窗口」,只需要向deque添加行,它將處理已丟棄的完整行。

dq = collections.deque(maxlen=50000) 
with open(...) as csv_file: 
    reader = csv.DictReader((line.replace("\0", "") for line in csv_file), delimiter="\t") 

    # initial fill 
    for _ in range(50000): 
     dq.append(reader.next()) 

    # repeated compute 
    try: 
     while 1: 
      compute(dq) 
      for _ in range(10000): 
       dq.append(reader.next()) 
    except StopIteration: 
      compute(dq) 
+1

'try/except'應該更接近'reader.next()'以避免意外地從'compute(dq)'中捕獲'StopIteration' – jfs

3

不要使用csv.DictReader,改用csv.reader。爲每行創建一個字典比創建每行的列表需要更長的時間。此外,通過索引訪問列表比通過鍵訪問字典要快得多。

我使用兩個csv閱讀器對300,000行4列csv文件進行定時迭代。 csv.DictReader花了七倍長csv.reader

將此與katrielalex's suggestion結合使用以使用collections.deque,您應該看到一個很好的加速。

此外,profile您的代碼可以查明您花費大部分時間在哪裏。

相關問題