2011-09-13 32 views
1

我想我一直在改進我以前的問題。基本上,我需要大塊的文本(csv)文件發送片斷到一個multiprocess.Pool。要做到這一點,我認爲我需要在迭代對象中迭代行。 (見how to multiprocess large text files in python?爲什麼一個可迭代對象在Python中沒有長度?

現在我意識到,文件對象本身(或_io.TextIOWrapper型)打開一個文本後是線迭代線,所以也許我的分塊碼(目前低於,對不起,以前失蹤了)可以大塊,如果它可以得到它的長度?但是,如果它是可迭代的,爲什麼我不能簡單地調用它的長度(按行而不是字節)?

謝謝!

def chunks(l,n): 
    """Divide a list of nodes `l` in `n` chunks""" 
    l_c = iter(l) 
    while 1: 
     x = tuple(itertools.islice(l_c,n)) 
     if not x: 
      return 
     yield x 

回答

3

文件可迭代的原因是它們被串行讀取。除非處理完整個文件,否則無法計算文件的長度(按行)。 (該文件的長度以字節爲單位,並不表示它有多少行。)

問題是,如果文件是千兆字節長,如果可以幫助它,可能不想讀兩次。

這就是爲什麼最好不知道長度;這就是爲什麼我們應該將數據文件作爲Iterable而不是具有長度的集合/矢量/數組處理。

你的分塊代碼應該能夠直接處理文件對象本身,而不知道它的長度。

但是如果你想完全處理之前需要了解的行數,你的2個選項是

  1. 緩衝整個文件到線的陣列,然後再通過這幾行分塊
  2. 讀過兩遍,第一次丟棄所有數據,只是記錄行
+0

謝謝!我希望如果8個內核最終以最先計數線路爲代價完成實際工作,我會獲得更多收益。如果不知道有多少行放入塊併發送到內核,我看不出有什麼辦法可以讓我的分塊工作。我希望這是一樣好,我可以在py3k中獲得:

相關問題