6

私はPythonとプログラミング全般にまったく慣れていませんが、Pythonで約700万行を含むタブ区切りの.txtファイルに対して「スライディングウィンドウ」計算を実行しようとしています。スライディングウィンドウとは、たとえば50,000行で計算を実行し、その数を報告してから、たとえば10,000行上に移動し、さらに50,000行で同じ計算を実行することを意味します。計算と「スライディングウィンドウ」が正しく機能しており、データの小さなサブセットでテストするとうまく機能します。ただし、データセット全体に対してプログラムを実行しようとすると、非常に遅くなります(現在、約40時間実行しています)。計算は非常に単純なので、これほど長くかかることはないと思います。

私が今.txtファイルを読んでいる方法は、csv.DictReaderモジュールを使用することです。私のコードは次のとおりです。

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

これにより、一度に700万行すべてから辞書が作成されると思います。これが、大きなファイルの場合に非常に遅くなる理由である可能性があると思います。

一度にデータの「チャンク」または「ウィンドウ」に対して計算を実行することにのみ関心があるので、一度に指定された行のみを読み取り、計算を実行してから、新しい指定された「指定された行のチャンク」または「ウィンドウ」?

4

2 に答える 2

6

Acollections.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)
于 2012-11-15T16:28:52.127 に答える
3

を使用せずcsv.DictReader、代わりにを使用してくださいcsv.reader。各行のリストを作成するよりも、各行の辞書を作成する方が時間がかかります。さらに、キーで辞書にアクセスするよりも、インデックスでリストにアクセスする方がわずかに高速です。

2つのcsvリーダーを使用して、300,000行4列のcsvファイルで反復の時間を計りました。 の7倍csv.DictReaderの時間がかかりました。csv.reader

これをkatrielalexの使用提案と組み合わせるcollections.dequeと、素晴らしいスピードアップが見られるはずです。

さらに、コードのプロファイルを作成して、ほとんどの時間を費やしている場所を特定します。

于 2012-11-15T17:02:35.310 に答える