最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python高效處理大文件的方法詳解

 更新時間:2022年07月25日 14:14:22   作者:Awan  
在這篇文章中,我們將學習如何使用multiprocessing、joblib和tqdm?Python包減少大文件的處理時間。這是一個簡單的教程,可以適用于任何文件、數(shù)據(jù)庫、圖像、視頻和音頻,感興趣的可以了解一下

為了進行并行處理,我們將任務(wù)劃分為子單元。它增加了程序處理的作業(yè)數(shù)量,減少了整體處理時間。

例如,如果你正在處理一個大的CSV文件,你想修改一個單列。我們將把數(shù)據(jù)以數(shù)組的形式輸入函數(shù),它將根據(jù)可用的進程數(shù)量,一次并行處理多個值。這些進程是基于你的處理器內(nèi)核的數(shù)量。

在這篇文章中,我們將學習如何使用multiprocessing、joblib和tqdm Python包減少大文件的處理時間。這是一個簡單的教程,可以適用于任何文件、數(shù)據(jù)庫、圖像、視頻和音頻。

開始

我們將使用來自 Kaggle 的 US Accidents (2016 - 2021) 數(shù)據(jù)集,它包括280萬條記錄和47個列。

我們將導入multiprocessing、joblib和tqdm用于并行處理,pandas用于數(shù)據(jù)導入,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()來設(shè)置n_workers。正如你所看到的,我們有8個workers。

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

下一步,我們將使用pandas read_csv函數(shù)讀取大型CSV文件。然后打印出dataframe的形狀、列的名稱和處理時間。

%%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是一個用于處理文本的簡單函數(shù)。我們將使用nltk.copus獲得英語停止詞,并使用它來過濾掉文本行中的停止詞。之后,我們將刪除句子中的特殊字符和多余的空格。它將成為確定串行、并行和批處理的處理時間的基準函數(shù)。

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()函數(shù),但是如果你想看到進度條,你需要為pandas激活tqdm,然后使用.progress_apply()函數(shù)。

我們將處理280萬條記錄,并將結(jié)果保存回 “Description” 列中。

%%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是一個內(nèi)置的python包,通常用于并行處理大型文件。

我們將創(chuàng)建一個有8個workers的多處理池,并使用map函數(shù)來啟動進程。為了顯示進度條,我們將使用tqdm。

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

%%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

并行處理

我們現(xiàn)在將學習另一個Python包來執(zhí)行并行處理。在本節(jié)中,我們將使用joblib的Parallel和delayed來復制map函數(shù)。

  • Parallel需要兩個參數(shù):n_job = 8和backend = multiprocessing。
  • 然后,我們將在delayed函數(shù)中加入clean_text。
  • 創(chuàng)建一個循環(huán),每次輸入一個值。

下面的過程是相當通用的,你可以根據(jù)你的需要修改你的函數(shù)和數(shù)組。我曾用它來處理成千上萬的音頻和視頻文件,沒有任何問題。

建議:使用 "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()中添加“Description”列。

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

輸出

我們的函數(shù)比多進程處理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

并行批量處理

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

批量處理函數(shù)

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

將文件分割成批

下面的函數(shù)將根據(jù)workers的數(shù)量把文件分成多個批次。在我們的例子中,我們得到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]

運行并行批處理

最后,我們將使用Parallel和delayed來處理批次。

%%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]

輸出

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

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 并發(fā)

tqdm將多處理帶到了一個新的水平。它簡單而強大。

process_map需要:

  • 函數(shù)名稱
  • Dataframe 列名
  • max_workers
  • chucksize與批次大小類似。我們將用workers的數(shù)量來計算批處理的大小,或者你可以根據(jù)你的喜好來添加這個數(shù)字。
%%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)

輸出

通過一行代碼,我們得到了最好的結(jié)果:

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

結(jié)論

我們需要找到一個平衡點,它可以是串行處理,并行處理,或批處理。如果你正在處理一個較小的、不太復雜的數(shù)據(jù)集,并行處理可能會適得其反。

在這個教程中,我們已經(jīng)了解了各種處理大文件的Python包,它們允許我們對數(shù)據(jù)函數(shù)進行并行處理。

如果你只處理一個表格數(shù)據(jù)集,并且想提高處理性能,那么建議你嘗試Dask、datatable和RAPIDS。

到此這篇關(guān)于Python高效處理大文件的方法詳解的文章就介紹到這了,更多相關(guān)Python處理大文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python的列表List求均值和中位數(shù)實例

    python的列表List求均值和中位數(shù)實例

    這篇文章主要介紹了python的列表List求均值和中位數(shù)實例,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 詳解python之heapq模塊及排序操作

    詳解python之heapq模塊及排序操作

    說到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其實還有還就中方法喲,并且好多種場景下效率都會比sorted高。那么接下來我就依次來介紹我所知道的排序操作
    2019-04-04
  • 基于Python實現(xiàn)格斗小游戲的示例代碼

    基于Python實現(xiàn)格斗小游戲的示例代碼

    格斗游戲,曾經(jīng)是街機廳里最火爆的游戲之一,甚至可以把“之一”去掉,那個年代的格斗游戲就是街機游戲的王。本文就來用Python實現(xiàn)一個簡單的格斗游戲,感興趣的可以了解一下
    2023-03-03
  • python實現(xiàn)發(fā)送form-data數(shù)據(jù)的方法詳解

    python實現(xiàn)發(fā)送form-data數(shù)據(jù)的方法詳解

    這篇文章主要介紹了python實現(xiàn)發(fā)送form-data數(shù)據(jù)的方法,結(jié)合實例形式分析了Python發(fā)送form-data數(shù)據(jù)的相關(guān)操作步驟、實現(xiàn)方法與注意事項,需要的朋友可以參考下
    2019-09-09
  • Pandas實現(xiàn)groupby分組統(tǒng)計的實踐

    Pandas實現(xiàn)groupby分組統(tǒng)計的實踐

    本文主要介紹了Pandas實現(xiàn)groupby分組統(tǒng)計的實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python調(diào)用ChatGPT的API實現(xiàn)文章生成

    Python調(diào)用ChatGPT的API實現(xiàn)文章生成

    最近ChatGPT大火,在3.5版本后開放了接口API,所以很多人開始進行實操,這里我就用python來為大家實現(xiàn)一下,如何調(diào)用API并提問返回文章的說明
    2023-03-03
  • Django如何實現(xiàn)密碼錯誤報錯提醒

    Django如何實現(xiàn)密碼錯誤報錯提醒

    這篇文章主要介紹了Django如何實現(xiàn)密碼錯誤報錯提醒,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
    2020-09-09
  • Python使用HTTP POST上傳WAV文件的方法

    Python使用HTTP POST上傳WAV文件的方法

    Python是一個非常流行的編程語言,可以用于開發(fā)不同類型的應用程序。其中,上傳文件是一個非常常見的需求。具體而言,我們探討了使用HTTP POST請求上傳單個和多個WAV文件的方法。無論你是需要將音頻文件上傳到云存儲還是服務(wù)器,這些方法都能幫助你上傳文件。
    2023-06-06
  • Python3.6實現(xiàn)連接mysql或mariadb的方法分析

    Python3.6實現(xiàn)連接mysql或mariadb的方法分析

    這篇文章主要介紹了Python3.6實現(xiàn)連接mysql或mariadb的方法,結(jié)合實例形式分析了Python3.6針對mysql或mariadb數(shù)據(jù)庫操作的相關(guān)模塊安裝、數(shù)據(jù)庫與表的創(chuàng)建、數(shù)據(jù)庫連接等操作技巧與注意事項,需要的朋友可以參考下
    2018-05-05
  • Python中實現(xiàn)對list做減法操作介紹

    Python中實現(xiàn)對list做減法操作介紹

    這篇文章主要介紹了Python中實現(xiàn)對list做減法操作介紹,需要的朋友可以參考下
    2015-01-01

最新評論

扶沟县| 石泉县| 常德市| 武强县| 肥东县| 上林县| 昌江| 奉新县| 卢龙县| 运城市| 容城县| 久治县| 游戏| 延长县| 宜城市| 张家口市| 文化| 乐业县| 芦溪县| 扬中市| 天全县| 元朗区| 宜昌市| 山阴县| 台州市| 商丘市| 盖州市| 蒙城县| 双桥区| 都江堰市| 新源县| 普陀区| 德阳市| 田东县| 永兴县| 淮滨县| 昭平县| 全椒县| 东乡| 昔阳县| 清新县|