8

私はこれに数週間取り組んでおり、Pythonのメモリリークに関する多くの質問を読みましたが、それを理解することはできません.

約 700 万行を含むファイルがあります。行ごとに辞書を作成する必要があります。したがって、これは次のような辞書のリストです。

[{'a': 2, 'b':1}{'a':1, 'b':2, 'c':1}]

私がしていることは...

list = []
for line in file.readlines():
    terms = line.split(" ")
    dict = {}
    for term in terms:
        if term in dict:
            dict[term] = dict[term] + 1
        else:
            dict[term] = 1
    list.append(dict.copy())
    dict.clear()
file.close()

問題は、これを実行すると、常に 6000000 行目あたりで強制終了されることです。元々やってるだけだっdict = {}たのですが、似たような投稿を読んでから dict.clear() をするように変更しましたが、何も改善しませんでした。循環参照について言及されているいくつかの投稿を知っていて、コードを調べましたが、その問題があるとは思いませんでした。

リストに 700 万の辞書を保存することは、Python では処理できないと思いますか? 殺されることなくすべてを実行する方法についてアドバイスをいただければ幸いです。

(バージョンは2.7.4です)

4

2 に答える 2

8

試す:

from collections import Counter
with open('input') as fin:
    term_counts = [Counter(line.split()) for line in fin]

これが、コードで達成しようとしているものだと思います。

.readlines()これにより、最初にファイルをメモリにロードするのを回避Counterし、カウントを行うために利用し、辞書の消去/割り当て/クリア/リストへの追加を気にすることなく、一度にリストを構築します...

于 2013-07-20T20:04:32.647 に答える
1

Python は少なくとも中途半端なガベージ コレクションを使用するため、これほど単純なコード スニペットでメモリ リークが発生することはありません。潜在的な問題の 1 つは、メモリが不足している可能性があることです (したがって、最初に .readlines を使用することは絶対に避けてください。代わりに「for line in my_file」を使用してください)。また、ディクショナリは実際にはさまざまな理由でかなりの量のメモリを使用します。1 つは、ディクショナリが実際の現在のキー セットよりもかなり大きなハッシュ テーブルを意図的に使用することです。これは、衝突を軽減するだけでなく、大量のキーをすばやく追加できるようにするためでもあります。必要に応じて、挿入ごとに償却された O(1) 時間で、新しいキーの。ファイルが死ぬ前にファイルの終わりに近づいているため、最後の辞書を k タプルの 2 タプルとして保存することを試みることができます。ここで、最初の k タプルには、保存したい k キーが含まれています。 、2番目のkタプルは、kキーのkカウントです。これにより、メモリをいくらか節約できますが、2 タプル T のいずれかで my_key を検索するには、次のようにする必要があります。

match_idx = [i for i in xrange(len(T[0])) if T[0][i] == my_key]
if len(match_idx) == 0:
  # no match, do whatever
else: #match
  count = T[1][match_idx[0]] 
  # now do whatever with count

ルックアップの実行時間は、一定時間ではなく、検索する必要があるキーの数に比例します (ただし、辞書ルックアップを行うためのハッシュは簡単な操作ではないため、定数はより簡単な操作のための典型的な定数)。キーを並べ替えた順序で保存した場合、バイナリ検索を使用してキーをすばやく見つけることができますが、これにはより多くのコードが必要になります。短いコードを与える傾向があるため、部分的に Python を使用していると思います。ただし、すでに 600 万個の辞書を正常に作成している場合、平均して 700 万個の辞書に多くのキーが含まれていてはなりません。したがって、本当にデータ セットに python を使用したい場合は、より多くのメモリを備えたマシンを入手しない限り、これが唯一の方法の 1 つになる可能性があります。

于 2013-07-20T20:42:55.937 に答える