2016-07-16 33 views
0

私は現在、大きなファイル(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() 

私が間違っていることを知っている人はいますか?

+0

完全なトレースバックを表示します。 「私はいつもMemoryErrorを取得する」とは信じているかどうか、あまりにも曖昧です。 –

+0

_some_ researchも実行します。コードを実行することはできません。たとえば、 'nlp()'の呼び出しをやめるとどうなりますか? 'spaCy'ユーザーからのメモリ使用量の増加の報告を見つけることは難しくありません。例えば、http://stackoverflow.com/questions/37779050/running-out-of-ram-when-writing-to-a-file-line-by-line-python だから、あなたが 'スパシー。 _not_を使用して試してみると、メモリ使用量が限界を超えて成長を止めるのを見つけると、 "問題"が特定されています。 –

+0

spaCyは定期的に使用するモジュールですが、spaCyのMemoryErrorsは、解析モデルを読み込むのに十分なメモリがないために発生します。これはそうではありません。私はたくさんの研究をしようとしましたが、他に何をすべきですか? –

答えて

0

あなたのコードにはないようですが、データに含まれる可能性があります。あなたはその反復をスキップしようとしましたか?

x = 0 
for comment in tqdm(objects): 
    x += 1 
    if x != 8162735 

     comment = str(comment.encode('ascii', 'ignore')) 
     if ">" in comment: 
      c_parse_thread = threading.Thread(target=finish_parse, args=(comment,)) 
      c_parse_thread.start() 
+0

それは私の 'except MemoryError:'がすべきことです。その時点で、キューが少し空になり、繰り返しをスキップするために数秒待つ。 –

関連する問題