128

大きな CSV ファイルをインポートし、ファイル内の各単語の出現回数をカウントし、カウントを別の CSV ファイルにエクスポートする Python スクリプトがあります。

しかし、何が起こっているかというと、そのカウント部分が終了し、エクスポートが開始されるとKilled、ターミナルに表示されます。

これはメモリの問題ではないと思います(もしそうなら、メモリエラーではなくメモリエラーが発生すると思いますKilled)。

プロセスに時間がかかりすぎている可能性がありますか? もしそうなら、これを回避できるようにタイムアウト期間を延長する方法はありますか?

コードは次のとおりです。

csv.field_size_limit(sys.maxsize)
    counter={}
    with open("/home/alex/Documents/version2/cooccur_list.csv",'rb') as file_name:
        reader=csv.reader(file_name)
        for row in reader:
            if len(row)>1:
                pair=row[0]+' '+row[1]
                if pair in counter:
                    counter[pair]+=1
                else:
                    counter[pair]=1
    print 'finished counting'
    writer = csv.writer(open('/home/alex/Documents/version2/dict.csv', 'wb'))
    for key, value in counter.items():
        writer.writerow([key, value])

が印刷された後にKilled発生し、完全なメッセージは次のとおりです。finished counting

killed (program exited with code: 137)
4

5 に答える 5

130

終了コード 137 (128+9) は、シグナル 9 を受信したためにプログラムが終了したことを示しますSIGKILL。これは、メッセージについても説明していkilledます。問題は、なぜその信号を受信したかということです。

最も可能性の高い理由は、プロセスが使用できるシステム リソース量の制限を超えたことです。OS と構成によっては、これは、開いているファイルが多すぎる、ファイルシステムのスペースを使いすぎている、またはその他の何かを意味している可能性があります。最も可能性が高いのは、プログラムがメモリを使いすぎていることです。メモリ割り当てが失敗し始めたときに何かが壊れる危険を冒すのではなく、システムは、メモリを使いすぎているプロセスに kill シグナルを送信しました。

前にコメントしたように、印刷後にメモリ制限に達する可能性がある理由の 1 つは、最後のループでfinished countingを呼び出すとcounter.items()、辞書のすべてのキーと値を含むリストが割り当てられるためです。ディクショナリに大量のデータがある場合、これは非常に大きなリストになる可能性があります。可能な解決策counter.iteritems()は、ジェネレーターであるを使用することです。リスト内のすべてのアイテムを返すのではなく、はるかに少ないメモリ使用量でアイテムを反復処理できます。

したがって、最後のループとしてこれを試すことをお勧めします。

for key, value in counter.iteritems():
    writer.writerow([key, value])

itemsPython 3 では、Python 2 のバージョンと同じオーバーヘッドを持たない「辞書ビュー」オブジェクトを返すことに注意してください。を置き換えるiteritemsため、後で Python のバージョンをアップグレードすると、ループを元の状態に戻すことになります。

于 2013-10-05T00:02:35.883 に答える
4

時間がかかるという理由だけで、何かがプロセスを強制終了しているとは思えません。強制終了とは一般的に、外部からの何かがプロセスを終了したことを意味しますが、この場合は Ctrl-C を押すと、Python が KeyboardInterrupt 例外で終了するため、おそらくそうではありません。また、Python では、それが問題である場合、MemoryError 例外が発生します。発生している可能性があるのは、プロセスのクラッシュを引き起こす Python または標準ライブラリ コードのバグに遭遇したことです。

于 2013-10-04T19:52:24.397 に答える