私は現在、大きなファイル(5ギガヘルツ、30ギガバイトのデータが読み込まれています)からレッドコメントを読み込むスクリプトを書いています。私のスクリプトは、コメントを読んで、テキストをチェックして解析し、(別のスレッドで実行されている)Queue関数に送ります。私が何をしていても、私はいつも特定の反復でMemoryErrorを取得します(問題がわずかであれば番号8162735)。そして、私はエラーを処理するように見えることはできません、Windowsはヒット時にPythonをシャットダウンし続けます。ここにスクリプトがあります:Python MemoryError(キューとスレッディングあり)
import ujson
from tqdm import tqdm
import bz2
import json
import threading
import spacy
import Queue
import time
nlp = spacy.load('en')
def iter_comments(loc):
with bz2.BZ2File(loc) as file_:
for i, line in (enumerate(file_)):
yield ujson.loads(line)['body']
objects = iter_comments('RC_2015-01.bz2')
q = Queue.Queue()
f = open("reddit_dump.bin", 'wb')
def worker():
while True:
item = q.get()
f.write(item)
q.task_done()
for i in range(0, 2):
t = threading.Thread(target=worker)
t.daemon = True
t.start()
def finish_parse(comment):
global q
try:
comment_parse = nlp(unicode(comment))
comment_bytes = comment_parse.to_bytes()
q.put(comment_bytes)
except MemoryError:
print "MemoryError with comment {0}, waiting for Queue to empty".format(comment)
time.sleep(2)
except AssertionError:
print "AssertionError with comment {0}, skipping".format(comment)
for comment in tqdm(objects):
comment = str(comment.encode('ascii', 'ignore'))
if ">" in comment:
c_parse_thread = threading.Thread(target=finish_parse, args=(comment,))
c_parse_thread.start()
q.join()
f.close()
私が間違っていることを知っている人はいますか?
完全なトレースバックを表示します。 「私はいつもMemoryErrorを取得する」とは信じているかどうか、あまりにも曖昧です。 –
_some_ researchも実行します。コードを実行することはできません。たとえば、 'nlp()'の呼び出しをやめるとどうなりますか? 'spaCy'ユーザーからのメモリ使用量の増加の報告を見つけることは難しくありません。例えば、http://stackoverflow.com/questions/37779050/running-out-of-ram-when-writing-to-a-file-line-by-line-python だから、あなたが 'スパシー。 _not_を使用して試してみると、メモリ使用量が限界を超えて成長を止めるのを見つけると、 "問題"が特定されています。 –
spaCyは定期的に使用するモジュールですが、spaCyのMemoryErrorsは、解析モデルを読み込むのに十分なメモリがないために発生します。これはそうではありません。私はたくさんの研究をしようとしましたが、他に何をすべきですか? –