簡體   English   中英

如何使用多線程快速下載Python中的1000+.txt文件

[英]How to use multithreading to download 1000+ .txt files in Python quickly

我有一個 .txt 文件,其中包含 1000 多個 .txt 文件的 URL 列表,我需要下載這些文件然后按字詞索引。 索引速度很快,但下載是一個巨大的瓶頸。 我嘗試使用 urllib2 和 urllib.request,但是使用這兩個庫中的任何一個下載單個文本文件需要 25-0.5 秒每個文件(平均這些文件大約是 600 個單詞/3000 個文本字符)

我意識到此時我需要使用多線程(作為一個概念),但我不知道在 Python 中我會如何做這件事。 在這一點上,我一次下載一個,它看起來像這樣:

        with open ('urls.txt', 'r') as f:                   # urls.txt is the .txt file of urls, one on each line
            for url in f:
                response = urllib.request.urlopen(url)
                data = response.read()
                text = data.decode()
                # .. and then index the text

這個項目提示允許我使用 select 任何語言。 我選擇了 Python 因為我認為它會更快。 我收到的樣本 output 列出的總索引時間約為 1.5 秒,所以我認為這大約是他們希望申請人達到的基准。 在我的機器(有 4 個內核)上,是否有可能在 Python 中為這么多可下載文件實現如此快速的運行時間?

編輯(包括有關索引的更多信息):

我下載的每個 .txt 文件都包含對大學的評論。 最終我想索引每條評論中的所有術語,這樣當你按術語搜索時,你會得到一個列表,其中列出了所有評論中包含該術語的大學,以及該術語在給定的評論中使用了多少次大學。 我有嵌套的字典,這樣另一個鍵是搜索詞,外部值是字典。 內部詞典的術語是一所大學的名稱,內部詞典的值是該術語在該大學的評論中出現的次數。

我不知道您在索引文本時到底在做什么,以及是否應該在線程之間交換數據,或者您是否正在寫入單個文件/變量(應該使用鎖),但這應該有效:

import threading
import urllib.request

with open('urls.txt', 'r') as f:
    urls = f.read().splitlines()
    
def download_index(url, lock):
    response = urllib.request.urlopen(url)
    data = response.read()
    text = data.decode()
    #indexing
    with lock:
        #access shared resources

n = 2 #number of parallel connections
chunks = [urls[i * n:(i + 1) * n] for i in range((len(urls) + n - 1) // n )]

lock = threading.Lock()
                
for chunk in chunks:
    threads = []
    for url in chunk:
        thread = threading.Thread(target=download_index, args=(url, lock,))
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()

請注意,您應該考慮一次應該有多少連接,因為您很可能會因為同時發生 1000 多個請求而被阻止。 我不知道理想的數字,但玩弄n數字,看看有什么用。 或者使用代理。

編輯:添加了一個鎖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM