2011-09-13 5 views
1

私は以前の質問を常に改善していると思います。基本的に、私は大きなテキスト(csv)ファイルを分割してマルチプロセスに送る必要があります。プール。そうするためには、反復可能なオブジェクトが必要です あなたがテキストファイルを開いた後ラインで反復可能なラインなので、おそらく私のチャンクコード(今や以下、以前にそれが欠けて申し訳ありません今、私はファイルオブジェクトそのもの(または_io.TextIOWrapperタイプ)ことに気づきなぜiterableオブジェクトはPythonでは長さがありませんか?

how to multiprocess large text files in python?を参照してください) )それは長さを得ることができる場合、それをチャンクすることができますか?しかし、iterableの場合、なぜ私は単純にその長さを(行ではなく、バイトでなく)呼び出すことができますか?

ありがとうございます!

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

ファイルが連続して読み込まれる理由は、ファイルが繰り返し可能であることです。ファイル全体の長さは、ファイルが処理されていない限り、計算することはできません。(ファイルの長さはバイト数で表されています)

問題は、ファイルがギガバイトの長さだった場合、そのファイルを手助けすることができれば2度読みたくないことです。

これは長さを知らない方が良い理由です。そのため、長さを持つコレクション/ベクトル/配列ではなく、Iterableというデータファイルを処理する必要があります。

あなたのチャンクコードは、その長さを知らずにファイルオブジェクト自体を直接扱うことができます。

しかしあなたが完全に処理する前に、行数を知りたいと思った場合、あなたの2つのオプションは、あなたのチャンカ にこれらのラインを通過し、最初の行の配列にファイル全体をバッファリング

  1. です
  2. これを2回読み、最初にすべてのデータを破棄し、行を記録するだけです。
+0

ありがとう!私は、8つのコアが最終的に実際の作業を終わらせ、最初にラインを数えてしまうと、もっと多くを得ることを願っています。チャンクを入れてコアに送る行数がわからなくてもチャンクが機能する方法は見当たりません。私はこれがpy3kで入手できるほど良いと思います。

関連する問題