<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    用Python并行處理大文件,看這篇就夠了!

    VSole2022-08-10 09:41:22

    為了進行并行處理,我們將任務劃分為多個子單元。它增加了程序處理的工作數量,減少了整體處理時間。

    例如,如果你正在處理一個大的CSV文件,你想修改一個單列。我們將把數據以數組的形式送入函數,它將根據可用的工作者的數量,一次并行處理多個值。這些工作器是基于你的處理器內的核心數量的。

    注意:在一個較小的數據集上使用并行處理,不會提高處理時間。

    在這篇博客中,我們將學習如何使用多處理joblibtqdm Python包減少大文件的處理時間。這是一個簡單的教程,可以適用于任何文件、數據庫、圖像、視頻和音頻。

    注意:我們使用的是Kaggle筆記本進行實驗。處理時間可能因機器不同而不同。

    開始處理

    我們將使用Kaggle的美國事故(2016 - 2021)數據集(https://www.kaggle.com/datasets/sobhanmoosavi/us-accidents),該數據集由280萬條記錄和47列組成。

    我們將導入multiprocessing、joblib和tqdm用于并行處理,pandas用于數據攝取,re、nltk和string用于文本處理

    # Parallel Computing
    import multiprocessing as mp
    from joblib import Parallel, delayed
    from tqdm.notebook import tqdm
    # Data Ingestion 
    import pandas as pd
    # Text Processing 
    import re 
    from nltk.corpus import stopwords
    import string
    

    在我們直接進入之前,讓我們通過加倍cpu_count()來設置n_workers。正如你所看到的,我們有8個工人。

    n_workers = 2 * mp.cpu_count()
    print(f"{n_workers} workers are available")
    >>> 8 workers are available
    

    在下一步,我們將使用pandas read_csv函數攝取大型CSV文件。然后,打印出數據框的形狀、列的名稱和處理時間。

    注意:Jupyter的神奇函數%time可以在處理結束后顯示CPU timeswall time
    %%time
    file_name="../input/us-accidents/US_Accidents_Dec21_updated.csv"
    df = pd.read_csv(file_name)
    print(f"Shape:{df.shape}\n\nColumn Names:\n{df.columns}\n")
    

    輸出

    Shape:(2845342, 47)
    Column Names:
    Index(['ID', 'Severity', 'Start_Time', 'End_Time', 'Start_Lat', 'Start_Lng',
    'End_Lat', 'End_Lng', 'Distance(mi)', 'Description', 'Number', 'Street',
    'Side', 'City', 'County', 'State', 'Zipcode', 'Country', 'Timezone',
    'Airport_Code', 'Weather_Timestamp', 'Temperature(F)', 'Wind_Chill(F)',
    'Humidity(%)', 'Pressure(in)', 'Visibility(mi)', 'Wind_Direction',
    'Wind_Speed(mph)', 'Precipitation(in)', 'Weather_Condition', 'Amenity',
    'Bump', 'Crossing', 'Give_Way', 'Junction', 'No_Exit', 'Railway',
    'Roundabout', 'Station', 'Stop', 'Traffic_Calming', 'Traffic_Signal',
    'Turning_Loop', 'Sunrise_Sunset', 'Civil_Twilight', 'Nautical_Twilight',
    'Astronomical_Twilight'],
    dtype='object')
    CPU times: user 33.9 s, sys: 3.93 s, total: 37.9 s
    Wall time: 46.9 s
    

    清理文本

    clean_text是一個用于處理和清理文本的簡單函數。我們將使用nltk.copus獲得英語停止詞,并使用它來過濾掉文本行中的停止詞。之后,我們將刪除句子中的特殊字符和多余的空格。這將是確定串行并行批處理的處理時間的基線函數。

    def clean_text(text): 
      # Remove stop words
      stops = stopwords.words("english")
      text = " ".join([word for word in text.split() if word 
     not in stops])
      # Remove Special Characters
      text = text.translate(str.maketrans('', '', string.punctuation))
      # removing the extra spaces
      text = re.sub(' +',' ', text)
      return text
    

    串行處理

    對于串行處理,我們可以使用pandas的.apply()函數,但是如果你想看到進度條,你需要為pandas激活tqdm,然后使用.progress_apply()函數。

    我們將處理280萬條記錄,并將結果保存回 "描述 "列。

    %%time
    tqdm.pandas()
    df['Description'] = df['Description'].progress_apply(clean_text)
    

    輸出

    高端處理器串行處理280萬條記錄用了9分5秒。

    100% ?????????? 2845342/2845342 [09:05<00:00, 5724.25it/s]
    CPU times: user 8min 14s, sys: 53.6 s, total: 9min 7s
    Wall time: 9min 5s
    

    多處理

    有多種方法可以對文件進行并行處理,我們將了解所有這些方法。multiprocessing是一個內置的python包,通常用于并行處理大文件。

    我們將創建一個有8個工作者的多處理,并使用map函數來啟動進程。為了顯示進度條,我們將使用tqdm

    map函數由兩部分組成。第一個部分需要函數,第二個部分需要一個參數或參數列表。

    通過閱讀文檔了解更多。(https://docs.python.org/3/library/multiprocessing.html)

    %%time
    p = mp.Pool(n_workers) 
    df['Description'] = p.map(clean_text,tqdm(df['Description']))
    

    輸出

    我們的處理時間幾乎提高了3倍。處理時間從9分5秒下降到3分51秒

    100% ?????????? 2845342/2845342 [02:58<00:00, 135646.12it/s]
    CPU times: user 5.68 s, sys: 1.56 s, total: 7.23 s
    Wall time: 3min 51s
    

    并行處理

    我們現在將學習另一個Python包來執行并行處理。在本節中,我們將使用joblib的Paralleldelayed來復制map函數。

    • Parallel需要兩個參數:n_job = 8和backend = multiprocessing。
    • 然后,我們將在delayed函數中加入clean_text
    • 創建一個循環,每次送入一個值。下面的過程是相當通用的,你可以根據你的需要修改你的函數和數組。我曾用它來處理成千上萬的音頻和視頻文件,沒有任何問題。

    建議:使用 "try: "和 "except: "添加異常處理。

    def text_parallel_clean(array):
      result = Parallel(n_jobs=n_workers,backend="multiprocessing")(
      delayed(clean_text)
      (text) 
      for text in tqdm(array)
      )
      return result
    

    text_parallel_clean()中添加 "描述 "列。

    %%time
    df['Description'] = text_parallel_clean(df['Description'])
    

    輸出

    我們的函數比多處理Pool多花了13秒。即使如此,并行處理也比串行處理快4分59秒。

    100% ?????????? 2845342/2845342 [04:03<00:00, 10514.98it/s]
    CPU times: user 44.2 s, sys: 2.92 s, total: 47.1 s
    Wall time: 4min 4s
    

    并行批量處理

    有一個更好的方法來處理大文件,就是把它們分成若干批,然后并行處理。讓我們從創建一個批處理函數開始,該函數將在單個批次的值上運行clean_function

    批量處理函數

    def proc_batch(batch):
      return [
      clean_text(text)
      for text in batch
      ]
    

    將文件分割成批處理

    下面的函數將根據工作者的數量把文件分成多個批次。在我們的例子中,我們得到8個批次。

    def batch_file(array,n_workers):
      file_len = len(array)
      batch_size = round(file_len / n_workers)
      batches = [
      array[ix:ix+batch_size]
      for ix in tqdm(range(0, file_len, batch_size))
      ]
      return batches
    batches = batch_file(df['Description'],n_workers)
    >>> 100% ?????????? 8/8 [00:00<00:00, 280.01it/s]
    

    運行并行的批處理

    最后,我們將使用Paralleldelayed來處理批次。

    注意:為了得到一個單數組的值,我們必須運行列表理解,如下圖所示。
    %%time
    batch_output = Parallel(n_jobs=n_workers,backend="multiprocessing")(
      delayed(proc_batch)
      (batch) 
      for batch in tqdm(batches)
      )
    df['Description'] = [j for i in batch_output for j in i]
    

    輸出

    我們已經改善了處理時間。這種技術在處理復雜數據和訓練深度學習模型方面非常有名。

    100% ?????????? 8/8 [00:00<00:00, 2.19it/s]
    CPU times: user 3.39 s, sys: 1.42 s, total: 4.81 s
    Wall time: 3min 56s
    

    tqdm 并發

    tqdm將多進程帶到了一個新的水平。它簡單而強大。我將向每個數據科學家推薦它。

    查看文檔,了解更多關于多處理的信息。(https://tqdm.github.io/)

    process_map需要:

    1. 函數名稱
    2. 數據框架列
    3. max_workers
    4. chucksize與批量大小類似。我們將使用工人的數量來計算批處理的大小,或者你可以根據你的偏好來添加這個數字。
    %%time
    from tqdm.contrib.concurrent import process_map
    batch = round(len(df)/n_workers)
    df['Description'] = process_map(clean_text,df['Description'], max_workers=n_workers, chunksize=batch)
    

    輸出

    通過一行代碼,我們得到了最好的結果。

    100% ?????????? 2845342/2845342 [03:48<00:00, 1426320.93it/s]
    CPU times: user 7.32 s, sys: 1.97 s, total: 9.29 s
    Wall time: 3min 51s
    

    結論

    你需要找到一個平衡點,選擇最適合你情況的技術。它可以是串行處理、并行處理或批處理。如果你正在處理一個較小的、不太復雜的數據集,并行處理可能會適得其反。

    在這個迷你教程中,我們已經了解了各種Python包和技術,它們允許我們對數據函數進行并行處理。

    如果你只是在處理一個表格數據集,并且想提高你的處理性能,那么我將建議你嘗試Dask(https://www.dask.org/)、datatable(https://github.com/h2oai/datatable)和RAPIDS(https://rapids.ai/)。

    參考:https://www.kdnuggets.com/2022/07/parallel-processing-large-file-python.html

    python函數并行處理
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    為了進行并行處理,我們將任務劃分為多個子單元。我們將把數據以數組的形式送入函數,它將根據可用的工作者的數量,一次并行處理多個值。這些工作器是基于你的處理器內的核心數量的。Python包減少大文件的處理時間。處理時間可能因機器不同而不同。我們將導入multiprocessing、joblib和tqdm用于并行處理,pandas用于數據攝取,re、nltk和string用于文本處理。
    函數簡介 云函數是騰訊云為企業和開發者們提供的無服務器執行環境,可以無需購買和管理服務器的情況下運行代碼。只需使用平臺支持的語言編寫核心代碼并設置代碼運行的條件,即可在騰訊云基礎設施上彈性、安全地運行代碼。SCF是實時文件處理和數據處理等場景下理想的計算平臺。服務端配置云函數基礎配置選擇自定義創建,地域自選,部署模式,代碼部署,運行環境Python3.6,其余默認即可。
    CTF-web--命令注入
    2023-03-31 09:51:35
    大佬總結的文章,本篇文章閱讀時間大約30分鐘。一 、基本原理 命令注入指的是,利用沒有驗證過的惡意命令或代碼,對網站或服務器進行滲透攻擊。注入有很多種,并不僅僅只有SQL注入。Injection)客戶端腳本攻擊(Script?injection)動態函數注入攻擊(Dynamic?Evaluation)序列化注入&對象注入。這種題目又哪些常見的,一個是我們常用的文件包含,我們是可以使用system等函數的,或者是php函數,應該也屬于命令注入的范疇。類似于 ?
    GPT技術和人工智能的最新進展徹底改變了我們與機器交互的方式,帶來了更加人性化的體驗。 Auto-GPT 是一種在 GPT-3.5 架構上訓練的語言模型,是該技術的一個典型例子。 為了測試 Auto-GPT,要求它設計一個值得 Masterchef 的食譜生成器網站,該網站可以根據用戶的喜好創建新的、獨特的菜肴。它會以不同的方式多次執行相同的提示,直到破解代碼(毫不夸張地說)。因此,它爬
    深度神經網絡(dnn)在過去的十年中發展迅速,并已廣泛應用在現實生活中。與此同時,DNN模型已被證明容易受到安全和隱私攻擊。最近引起廣泛關注的一種攻擊是“后門攻擊”。具體地說,對手毒害了目標模型的訓練集,用一個附加的秘密觸發器將所有的輸入誤導為指定的目標類。之前的后門攻擊主要集中在計算機視覺(CV)應用上,如圖像分類。
    黑客如何利用ChatGPT
    2023-01-17 11:40:34
    Cybernews研究人員警告稱,AI聊天機器人雖然體驗很有趣,但也可能很危險,因為它能夠就如何利用任何漏洞提供詳細的建議。盡管AI為協助人類方面提供了巨大的可能性,但批評人士強調,創造一種超越人類能力的算法可能存在潛在危險,而且可能會失控。科幻小說中AI接管地球的災難場景仍然不太可能出現。在推出后的五天內,就有超過100萬人注冊測試這項技術。聊天機器人給出了在網站上搜索漏洞時需要檢查的五個基本出發點。
    Python從零到壹第17篇介紹可視化分析,希望您喜歡
    為了得到更好的數據分析結果,需要對這些數據集進行數據清洗和停用詞過濾等操作,這里利用Jieba庫進行清洗數據。向量空間模型是用向量來表征一個文本,它將中文文本轉化為數值特征。貴州省位于中國的西南地區,簡稱“黔”或“貴”。
    ChainFlag是一個區塊鏈主題的CTF OJ平臺,個人感覺現有題目質量很高,值得一做,這里分享下自己做題的過程。
    Python圖像處理第13篇文章介紹三維頂帽和黑帽運算
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类