1

私は前の質問を常に改善していると思います。基本的に、multiprocess.Poolにピースを送信するには、大きなテキスト(csv)ファイルをチャンク化する必要があります。そのためには、行を繰り返すことができる反復可能なオブジェクトが必要だと思います。( Pythonで大きなテキストファイルをマルチプロセッシングする方法を参照してください? )

テキストファイルを開いた後のファイルオブジェクト自体(または_io.TextIOWrapperタイプ)は1行ずつ反復可能であるため、チャンクコード(以下、以前は欠落していたことをお詫びします)でチャンクできる可能性があることに気付きました。その長さ?しかし、それが反復可能である場合、なぜその長さを(バイトではなく行で)単純に呼び出すことができないのですか?

ありがとう!

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
4

1 に答える 1

3

ファイルが反復可能である理由は、それらが連続して読み取られるためです。ファイル全体が処理されない限り、ファイルの長さ(行単位)を計算することはできません。(バイト単位のファイルの長さは、ファイルの行数を示すものではありません。)

問題は、ファイルの長さがギガバイトの場合、助けられれば2回読みたくないかもしれないということです。

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

チャンクコードは、ファイルオブジェクト自体の長さを知らなくても、ファイルオブジェクト自体を直接処理できる必要があります。

ただし、完全に処理する前に行数を知りたい場合は、2つのオプションがあります。

  1. buffer the whole file into an array of lines first, then pass these lines to your chunker
  2. read it twice over, the first time discarding all the data, just recording the lines
于 2011-09-13T00:51:43.273 に答える