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

    文章

    10990

    浏览量

    206738
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83468
  • csv
    csv
    +关注

    关注

    0

    文章

    35

    浏览量

    5760

原文标题:【yyds】python处理大文件太轻松了!

文章出处:【微信号:浩道linux,微信公众号:浩道linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux平台大文件生成和处理方法

    在日常工作中,为了验证某些场景下的功能,经常需要人为构造一些大文件进行测试,有时需要用大文件来测试下载速度,有时需要用大文件来覆盖磁盘空间;偶尔会看到一些网络博文会教大家如何构造大文件
    发表于 07-14 16:38 3454次阅读

    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次下载

    介绍Python 3 的功能 让人轻松地从Python 2迁移到Python 3

    为了使初学者能够轻松地从 Python 2 向 Python 3 实现迁移,我收集了一些 Python 3 的功能,希望对大家有所帮助。
    的头像 发表于 01-31 15:11 4232次阅读

    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 3254次阅读

    华为 8 款机型升级 EMUI 11 最新版,上线畅连大文件闪传和智感支付

    捷的智感支付。 IT之家了解到,畅连大文件闪传功能由华为 Mate40 系列首发搭载,两台手机点对点异地直传,依托华为在 5G 芯片、5G 终端和 5G 网络端到端能力,可以轻松实现超大文件疾速可达,断点仍可续传。据华为介绍,超
    的头像 发表于 01-08 10:27 2655次阅读

    Linux系统下传输大文件的切割与合并实例分析

    往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。
    的头像 发表于 07-02 11:47 1580次阅读
    Linux系统下传输<b class='flag-5'>大文件</b>的切割与合并实例分析

    网络工程师学Python-文件处理

    当涉及到 Python 文件处理时, 我们通常会涉及到文件的读取和写入, 以及文件的操作和处理
    的头像 发表于 04-27 09:21 427次阅读

    大文件传输的9种方法

    SendBig是在全球范围内发送你的文件的最简单方法。免费分享高达30GB的大文件、照片和视频,让文件共享变得简单。在不注册的情况下,可以发送高达50MB的数据,如果你想发送更大的文件
    的头像 发表于 07-29 11:12 2861次阅读
    <b class='flag-5'>大文件</b>传输的9种方法

    如何使用Python读取写入Word文件

    01 准备 Python 是一种通用编程语言,也可以用于处理 Microsoft Word 文件。在本文中,我将向你介绍如何使用 Python
    的头像 发表于 09-27 17:03 1458次阅读