Python实战技能-10-如何高效读取大型CSV文件

作为一名数据工作者,毫无疑问,整天都要与大量的csv或是excel文件打交道。在处理过程中,我们会遇到一些大型的csv文件,因为文件过大,可能超出内存限制,针对这些情况,我们应当如何处理?下面,根据自身遇到的一些场景,给出一些常见的处理方式:

制作一个简单数据集,并看读取效率

import pandas as ps
dict=[]
for i in range(30000000):
    dict.append({"col_01":"gdueywfgdyuegyufgeugfe","col_02":"hello world","column3":"python","column4":"my name is ywxkyanjiaxi"})
    
data = ps.DataFrame(dict)
data.to_csv(r'test.csv',index=False)

(1)常规pandas读取csv文件

import pandas as pd
import time
start_time = time.time()
df = pd.read_csv("test.csv",index_col = 0)
end_time = time.time()
diff_time = end_time - start_time
print(diff_time) #52.74955630302429

(2)分而治之,分块读取文件。将CSV文件分成若干个块进行处理,而不是将整个文件一次性读取到内存中。

import pandas as pd
#加了iterator=True 才会一直往下读csv,否则读了前100万行就退出了
import time
start = time.time()
chunck_df = pd.read_csv(
    r'test.csv' #文件路径
    ,chunksize=1000000 #块大小
    ,iterator=True #读取1000000万行后继续往下读
    )
end = time.time()
print(end-start)

for i,data in enumerate(chunck_df):
    print(data)

3)使用迭代器可以逐个地将CSV文件中的数据读取到内存中进行处理

import pandas as pd

chunksize = 100000  # 每块数据的大小
reader = pd.read_csv('test.csv', iterator=True,low_memory=False)
loop = True

while loop:
    try:
        chunk = reader.get_chunk(chunksize)
        print(chunk)
        # do_something(chunk)
    except StopIteration:
        loop = False
        print("Iteration is stopped")

(4)使用csv库读取文件:避免一次性将整个文件读入内存中,可以按行或按块读取数据。csv返回一个迭代器,需要使用for循环逐一读取。

import csv
with open('test.csv') as file:
    reader = csv.reader(file)
    for row in reader:
        # 处理每行数据
        process_row(row)

(5)使用dask读取csv

Dask是一个用于并行和分布式计算的python库,旨在处理大规模数据和复杂计算任务。它提供了一种灵活且高效的方式来执行数据处理、并行计算和分布式计算,使之可以轻松处理大规模数据。更多功能及原理探索,我们下期详解。

  • 并行和分布式计算

  • 延迟计算

  • 分布式任务调度,动态任务调度

  • 并行数据集合

!pip install dask
from dask import dataframe as dd
import time
start = time.time()
dask_df = dd.read_csv(r'test.csv')
end = time.time()
print(dask_df)

(6)datatable。Datatable 是一个用于数据操作和分析的Python库,它旨在提供高性能、内存效率和易用性。Datatable的设计使其能够处理大型数据集,执行高级数据操作,并支持并行计算。

!pip install datatable
import datatable as dt
import time

start_time = time.time()
data = dt.fread("test.csv")
print("加载数据所需时间:", time.time() - start_time)
#加载数据所需时间: 20.350489616394043

(7)polars。Polars 是一个用于数据操作和分析的Rust编写的数据框架,它可以与Python一起使用。Polars旨在提供高性能、内存效率和易用性,类似于Pandas,但有许多优化和并行计算功能。

import polars as pol
import time
start_time = time.time()
data_ = pol.read_csv('test.csv')
print(data_)
print("加载时间:",time.time() - start_time)

(8)Modin:Modin可以自动并行化Pandas操作,从而提高性能。Modin将Pandas DataFrame转换为多进程的数据结构,以充分利用多核CPU。

import modin.pandas as md
start = time.time()
df = md.read_csv("test.csv")
end = time.time()
print("Modin读取时间 = {}".format(end-start))

(9)Vaex:Vaex是一个用于大型数据集的高性能Python库,它可以处理CSV文件,支持快速筛选、计算和可视化大数据。Vaex的特点是能够处理大规模数据而不占用大量内存。

总结

      本文,我们介绍了几种高效读取csv的方法及其第三方库,可根据需求选择适合的手段来处理对应场景中的csv文件。后期,我们会更详细探索这些框架的更多功能,敬请关注。

参考:

【1】https://docs.dask.org/en/stable/

【2】https://pola-rs.github.io/polars-book/user-guide/

[3] https://datatable.readthedocs.io/en/latest/?badge=latest

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值