簡體   English   中英

Python 從 URL 下載 1000+ zip 文件時的速度優化

[英]Python speed optimization when downloading 1000+ zip files from URL

我正在嘗試下載包含 csv 文件的 zip 文件。

一方面,我有 3000 多個 URL 因此有 3000 個文件。 使用的代碼需要 1 到 2 個小時。 zip 文件的總大小為 40GB。 解壓230GB。

另一方面,100Ks 上還有另一組 URL。 查看處理先前數量的 URL 需要多長時間,我可以做些什么來改進此代碼? 我應該把它全部放在一個 function 中嗎?

我有可能在 Spark 集群上運行它。

#URLs in a list called links
#Filepaths are a list from ls on the folder of the raw zip files

def download_zip_files(x,base_url,filepath):
  r = requests.get(x)
  status_code = r.status_code
  filepath = str(x.replace(base_url,filepath))
  with open(filepath, "wb") as file:
    file.write(r.content)

def extract_zip_files(x,basepath,exportpath):
  path = str(basepath+x[1])
  with zipfile.ZipFile(path, "r") as zip_ref:
    zip_ref.extractall(exportpath)

list(map(lambda x: download_zip_files(x,base_url,filepath), links))
list(map(lambda x: extract_zip_files(x,basepath,exportpath), raw_zip_filepaths))

你需要的是多線程,一個快速的谷歌定義如下:

多線程是一種 CPU(中央處理單元)功能,允許兩個或多個指令線程在共享相同處理器資源的同時獨立執行。 線程是一個獨立的指令序列,可以與屬於同一根進程的其他線程並行執行。

大多數時候我們寫的程序都是單線程執行的(和你的一樣)請參見以下示例。

單線程

在此處輸入圖像描述

多線程方法

在此處輸入圖像描述 請考慮單線程和多線程示例的 output。 在多線程示例中,程序通過線程並行執行。 簡單來說,print_words() function 使用不同的參數並行(同時)執行兩次。

讓我們來看您的示例:您可以將 URL 列表划分為多個 URL 列表,並為每個線程提供一個 URL 列表,請參見以下示例,它只是一個 sudo 代碼,您應該自己實現它。

  import threading
  
  # Please divide the following list using any function I'm giving a simple example right now, so I'm not doing this.
  url_list=['url1','url2','url3','url4'] 
  # Following lists are divided into two lists.
  url_list_1=['url1','url2']
  url_list_2=['url3','url4']
  
  def download_zip_files(x,base_url,filepath):
    r = requests.get(x)
    status_code = r.status_code
    filepath = str(x.replace(base_url,filepath))
    with open(filepath, "wb") as file:
    file.write(r.content)
  
  def start_loop_download_zip(links):     
    list(map(lambda x: download_zip_files(x,base_url,filepath), links))
  

  t1 = threading.Thread(target=start_loop_download_zip,args=(url_list_1,))
  t2 = threading.Thread(target=start_loop_download_zip,args=(url_list_2,))
  # starting thread 1
  t1.start()
  # starting thread 2
  t2.start()
  # wait until thread 1 is completely executed
  t1.join()
  # wait until thread 2 is completely executed
  t2.join()

這種方法將顯着減少您的處理時間。

暫無
暫無

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

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