読み込み - python 等高線 csv




Pythonで大規模な.csvを解析する最も効率的な方法は? (3)

私は他の答えを見ようとしましたが、これを行う正しい方法はまだ分かりません。 私は本当に大きな.csvファイルをたくさん持っています(それぞれが1ギガバイトになる可能性があります)。そして、私は最初に列ラベルを取得したいのですが、それらがすべて同じではないため、ユーザーの好みに応じて、 。 抽出部分を始める前に、私はこのファイルを解析する最も速い方法が何であるか簡単なテストを行いました。ここに私のコードがあります:

def mmapUsage():
    start=time.time()
    with open("csvSample.csv", "r+b") as f:
        # memory-mapInput the file, size 0 means whole file
        mapInput = mmap.mmap(f.fileno(), 0)
        # read content via standard file methods
        L=list()
        for s in iter(mapInput.readline, ""):
            L.append(s)
        print "List length: " ,len(L)
        #print "Sample element: ",L[1]
        mapInput.close()
        end=time.time()
        print "Time for completion",end-start

def fileopenUsage():
    start=time.time()
    fileInput=open("csvSample.csv")
    M=list()
    for s in fileInput:
            M.append(s)
    print "List length: ",len(M)
    #print "Sample element: ",M[1]
    fileInput.close()
    end=time.time()
    print "Time for completion",end-start

def readAsCsv():
    X=list()
    start=time.time()
    spamReader = csv.reader(open('csvSample.csv', 'rb'))
    for row in spamReader:
        X.append(row)
    print "List length: ",len(X)
    #print "Sample element: ",X[1]
    end=time.time()
    print "Time for completion",end-start

そして私の結果:

=======================
Populating list from Mmap
List length:  1181220
Time for completion 0.592000007629

=======================
Populating list from Fileopen
List length:  1181220
Time for completion 0.833999872208

=======================
Populating list by csv library
List length:  1181220
Time for completion 5.06700015068

だから、ほとんどの人が使っているcsvライブラリは、他のものよりも本当に遅くなっているようです。 後で、私がCSVファイルからデータを抽出し始めたときの方が速いことが判明したかもしれませんが、それはまだわかりません。 実装を開始する前に、提案やヒントはありますか? どうもありがとう!


あなたは浄化についてどのくらい気にしていますか?

csvモジュールは、さまざまなCSVファイルの方言を理解し、エスケープすることが適切に行われていることを確認するのに本当にうってつけですが、それは間違いなく残酷であり、しばしばそれは価値のある問題です(特にユニコードがある場合)。

\,を適切にエスケープする本当に素朴な実装は次のようになります:

import re

def read_csv_naive():
    with open(<file_str>, 'r') as file_obj:
      return [re.split('[^\\],', x) for x in file_obj.splitlines()]

あなたのデータがシンプルなら、これはうまくいくでしょう。 より多くのエスケープが必要なデータがある場合、 csvモジュールはおそらく最も安定した賭けです。


他のいくつかの時点で指摘されているように、最初の2つのメソッドは実際の文字列解析を行わず、フィールドを抽出せずに一度に1行ずつ読み込みます。 私は、CSVに見られる速度差の大部分がそれに起因すると考えています。

CSVモジュールは、特にExcel形式から読み込んでいる場合は、カンマだけでなく「標準的な」CSV構文を多く含むテキストデータを含めると非常に役立ちます。 あなたが "1,2,3,4"のような行を持っているなら、おそらく単純な分割でうまくいくでしょうが、 "1,2のような行があれば、こんにちは、私の名前はフレッド" "エラーなしでそれを解析しようと狂ってしまうだろう。 CSVは、引用符で囲まれた文字列の途中で改行のようなものを透過的に処理します。 CSVのない単純なfor..inはそれに問題を起こすでしょう。

CSVモジュールは、私が次のように使用すると、ユニコード文字列を読んでもうまくいきました。

f = csv.reader(codecs.open(ファイル名、 'rU'))

これは、ユニコード、引用符付き文字列、引用符で囲まれた文字列の途中にある改行、最後にフィールドが欠落した行など、数千の行ファイルをインポートするのには堅牢です。 私はそれを最初に使用して、あなたが本当に余分な速度が必要な場合は、その上に最適化を探してみます。


大きなcsvファイルを読み込むには、ファイルのチャンクを読み込むための子プロセスを作成する必要があります。 ファイルリソースオブジェクトを取得するには、ファイルを開きます。 resourceを引数として子プロセスを作成します。 行の集合を塊として読む。 ファイルの最後に達するまで上記の3つの手順を繰り返します。

from multiprocessing import Process

def child_process(name):
    # Do the Read and Process stuff here.if __name__ == '__main__':
    # Get file object resource.
    .....
    p = Process(target=child_process, args=(resource,))
    p.start()
    p.join()

コードについては、このリンクを参照してください。 これはあなたを助けます。 http://besttechlab.wordpress.com/2013/12/14/read-csv-file-in-python/







csv