2016-06-15 12 views
0

私は、要求する必要がある100,000のURLを持つファイルを持っています。処理は要求と比較して無視できないほどの時間を要するので、単にマルチスレッドを使用すると、私に部分的なスピードアップを与えるだけです。私が読んだことから、multiprocessingモジュールなどを使用すると、複数のコアを使用できるため、より大幅なスピードアップが可能になると思います。私は複数のスレッドを持つ複数のプロセスを使用したいと思っていますが、どうやってそれを行うのかは分かりません。ここでPythonで100,000のURLを読み込んで処理する最速の方法

は(What is the fastest way to send 100,000 HTTP requests in Python?に基づく)のスレッドを使用して、私の現在のコードです:

from threading import Thread 
from Queue import Queue 
import requests 
from bs4 import BeautifulSoup 
import sys 

concurrent = 100 

def worker(): 
    while True: 
     url = q.get() 
     html = get_html(url) 
     process_html(html) 
     q.task_done() 

def get_html(url): 
    try: 
     html = requests.get(url, timeout=5, headers={'Connection':'close'}).text 
     return html 
    except: 
     print "error", url 
     return None 

def process_html(html): 
    if html == None: 
     return 
    soup = BeautifulSoup(html) 
    text = soup.get_text() 
    # do some more processing 
    # write the text to a file 

q = Queue(concurrent * 2) 
for i in range(concurrent): 
    t = Thread(target=worker) 
    t.daemon = True 
    t.start() 
try: 
    for url in open('text.txt'): 
     q.put(url.strip()) 
    q.join() 
except KeyboardInterrupt: 
    sys.exit(1) 
+1

。@ Gusでは、同時に100を使用してスピードアップすることはありません。それらはすべて同時に出ていて、驚いています。すべてOSプロセスを待って戻ってきます。あなたができることは、2つのステップです。スレッド化(i/o)ですべてを引き出し、コア* 2を使用してマルチプロセスを実行します。 (または、同じ問題があります) – Merlin

+0

私は参照してください。多分、私は2つのスクリプトに分割することができます.1つのスクリプトでマルチスレッドのみを使用し、生のHTMLをファイルに保存することができます。その後、ファイルを処理した後にファイルを削除して、マルチプロセッシングを行う別のファイルを作成します。これが最善の解決策であるかどうかは分かりませんか? – Gus

+0

それは私がやることです。 - そして、やります。 ---そうでなければ、言語を切り替えることができ、ノードjをスクレイプすることができますが、それは全く別のプロセスです。 – Merlin

答えて

0

ファイルではなく、「オープン」メソッドの使用にmmapでそれを開くと、使用可能なメモリよりも大きくない場合には( https://docs.python.org/3/library/mmap.html)。ファイルではなくメモリを使って作業しているのと同じ速度が得られます。

with open("test.txt") as f: 
    mmap_file = mmap.mmap(f.fileno(), 0) 
    # code that does what you need 
    mmap_file.close() 
関連する問題