在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何通過python輕松處理大文件

jf_TEuU2tls ? 來源:浩道linux ? 2023-04-27 10:54 ? 次閱讀

前言

大家好,這里是浩道linux,主要給大家分享linux、python網絡通信相關的IT知識平臺。

眾所周知,python除了以簡潔著稱,其成熟的第三方庫功能也是很強大的,今天浩道帶大家看看如何通過python輕松處理大文件,真讓人直呼yyds。

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

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

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

開始

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

https://www.kaggle.com/datasets/sobhanmoosavi/us-accidents

我們將導入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個workers。

n_workers = 2 * mp.cpu_count()


print(f"{n_workers} workers are available")


>>> 8 workers are available

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

%%time
file_name="../input/us-accidents/US_Accidents_Dec21_updated.csv"
df = pd.read_csv(file_name)


print(f"Shape:{df.shape}

Column Names:
{df.columns}
")

輸出:

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萬條記錄,并將結果保存回 “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是一個內置的python包,通常用于并行處理大型文件。

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

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

%%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的Parallel和delayed來復制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()中添加“Description”列。

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

將文件分割成批

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

輸出

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

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將多處理帶到了一個新的水平。它簡單而強大。

process_map需要:

函數名稱

Dataframe列名

max_workers

chucksize與批次大小類似。我們將用workers的數量來計算批處理的大小,或者你可以根據你的喜好來添加這個數字。

%%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、datatable和RAPIDS。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210400
  • 文件
    +關注

    關注

    1

    文章

    570

    瀏覽量

    24822
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62973
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85040
  • csv
    csv
    +關注

    關注

    0

    文章

    39

    瀏覽量

    5860

原文標題:【yyds】python處理大文件太輕松了!

文章出處:【微信號:浩道linux,微信公眾號:浩道linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何在Linux使用find和du命令搜索大文件和目錄

    隨著時間的推移,您的磁盤驅動器可能會被大文件占用大量磁盤空間,不必要文件弄得亂七八糟。
    發表于 12-07 17:17 ?4356次閱讀

    Linux平臺大文件生成和處理方法

    在日常工作中,為了驗證某些場景下的功能,經常需要人為構造一些大文件進行測試,有時需要用大文件來測試下載速度,有時需要用大文件來覆蓋磁盤空間;偶爾會看到一些網絡博文會教大家如何構造大文件
    發表于 07-14 16:38 ?3979次閱讀

    labview讀取大文件問題

    labview讀取二進制文件最大能讀取多大的文件,我讀160多兆的文件就不能讀取了,誰還有讀取大文件的好方法,分享一下。qq419069469
    發表于 07-29 16:57

    在Linux下如何清空或刪除大文件和大量文件

    快速刪除大文件1. 通過重定向到 Null 來清空文件內容清空或者讓一個文件成為空白的最簡單方式,是像下面那樣,通過 shell 重定向 n
    發表于 07-11 07:50

    cc3200如何讀寫大文件

    請教一下TI的工程師,如果需要讀寫一個大文件文件大小為300k。 而cc3200 RAM 為256k, ROM可以為1M。而且寫的時候,只能全部讀出來,再寫。 不能追加。 那有什么好方法可以讀寫一個大文件了?是不是將這個
    發表于 06-16 14:27

    請問如何上傳CSharp大文件

    CSharp大文件上傳解決方案
    發表于 11-16 07:48

    ESP8266如何通過wifi傳輸大文件

    我最近接到了一項關于 ESP12-F 模塊的任務。用戶 SPI 連接到皮質 m4 uC。現在我需要通過 WiFi 將一個大文件 (150MB) 發送到 ESP8266,然后將其存儲在連接到 uC
    發表于 02-23 06:56

    基于PHP大文件上傳的研究和設計

    基于PHP大文件上傳的研究和設計,感興趣的可以看看。
    發表于 02-22 18:15 ?6次下載

    TXT大文件切割軟體應用程序免費下載

    本文檔的主要內容詳細是TXT大文件切割軟體應用程序免費下載,可以切割任意大小的txt文件,可以根據大小,數量,標題等類別進行切割,絕對是大文件切割的必備工具,該軟體綠色免安裝,誰用誰知道~
    發表于 11-07 08:00 ?5次下載
    TXT<b class='flag-5'>大文件</b>切割軟體應用程序免費下載

    JAVA中NIO通過MappedByteBuffer操作大文件

    java io操作中通常采用BufferedReader,BufferedInputStream等帶緩沖的IO類處理大文件,不過java nio中引入了一種基于MappedByteBuffer操作大文件的方式,其讀寫性能極高,本
    的頭像 發表于 05-05 23:42 ?3535次閱讀

    華為 8 款機型升級 EMUI 11 最新版,上線暢連大文件閃傳和智感支付

    捷的智感支付。 IT之家了解到,暢連大文件閃傳功能由華為 Mate40 系列首發搭載,兩臺手機點對點異地直傳,依托華為在 5G 芯片、5G 終端和 5G 網絡端到端能力,可以輕松實現超大文件疾速可達,斷點仍可續傳。據華為介紹,超
    的頭像 發表于 01-08 10:27 ?3018次閱讀

    Linux系統下傳輸大文件的切割與合并實例分析

    往往是因為網絡傳輸的限制,導致很多時候,我們需要在 Linux 系統下進行大文件的切割。這樣將一個大文件切割成為多個小文件,進行傳輸,傳輸完畢之后進行合并即可。
    的頭像 發表于 07-02 11:47 ?1898次閱讀
    Linux系統下傳輸<b class='flag-5'>大文件</b>的切割與合并實例分析

    大文件傳輸的9種方法

    SendBig是在全球范圍內發送你的文件的最簡單方法。免費分享高達30GB的大文件、照片和視頻,讓文件共享變得簡單。在不注冊的情況下,可以發送高達50MB的數據,如果你想發送更大的文件
    的頭像 發表于 07-29 11:12 ?4030次閱讀
    <b class='flag-5'>大文件</b>傳輸的9種方法

    如何使用Python讀取寫入Word文件

    01 準備 Python 是一種通用編程語言,也可以用于處理 Microsoft Word 文件。在本文中,我將向你介紹如何使用 Python
    的頭像 發表于 09-27 17:03 ?2138次閱讀

    如何使用SFTP傳輸大文件

    在當今的數字化時代,大文件傳輸變得越來越常見。無論是企業數據遷移、遠程備份還是內容分發,都需要一種既安全又高效的文件傳輸方式。SFTP作為一種基于SSH的文件傳輸協議,提供了一種加密的傳輸方式,確保
    的頭像 發表于 11-13 14:11 ?972次閱讀
    主站蜘蛛池模板: 日本口工禁漫画无遮挡全彩 | 国产性较精品视频免费 | 久久久久国产一级毛片高清版 | 国产色视频网站 | 操操干干 | 久久精品成人免费网站 | 日本大片黄色 | 国产精品免费视频拍拍拍 | 久久免| 天天综合日日噜噜噜 | 亚欧毛片基地国产毛片基地 | 一级做a爰片久久毛片一 | 深爱五月激情五月 | 18黄网站 | 在线观看黄a | 免费一级特黄特色大片在线 | 人人玩人人弄人人曰 | 日本高清午夜色wwwσ | 亚洲一成人毛片 | 日本三级香港三级人妇99视 | 一区二区三区四区无限乱码在线观看 | 202z国产高清日本在线播放 | 色综合美国色农夫网 | 免费一级在线观看 | 狠狠色噜噜狠狠狠狠97 | 免费的三及片 | 婷色 | 高清不卡日本v在线二区 | 日本sese | avtt天堂网 手机资源 | 欧美系列在线观看 | 免费可以看黄的视频 s色 | 五月桃花网婷婷亚洲综合 | 亚洲专区一区 | 欧美成人天天综合在线视色 | 夜夜艹 | 夜色剧场| 国产在线精品一区二区夜色 | 亚洲成色999久久网站 | 哪个网站可以看av | 久久夜色精品国产飘飘 |