【问题标题】:What is the most efficient way to read a large CSV file ( 10 M+ records) located on S3 (AWS) with Python?使用 Python 读取位于 S3 (AWS) 上的大型 CSV 文件(10 M+ 条记录)的最有效方法是什么?
【发布时间】:2021-05-17 08:48:53
【问题描述】:

我一直在尝试找到从 S3 读取大型 csv 文件(10+ 百万条记录)并使用其中一列(总行数和平均值)执行几个简单操作的最快方法。 我已经进行了几次测试,到目前为止最快的是创建一个 dask 数据框,但我想知道是否还有其他替代方案可以让事情变得更快。

有什么建议吗? 谢谢!

测试 1. Pandas 读取 csv:92.36531567573547 秒

start_time = time.time()
s3 = boto3.client('s3')
path =my_csvS3
use_column=['tip_amount']
df= pd.read_csv(path,usecols=use_column)
print(df.count)
print (df["tip_amount"].mean())
print("%s seconds" % ((time.time())-(start_time)))

测试 2 Pandas 分块读取 csv:78.15214204788208 秒

import time
start_time = time.time()
tp = pd.read_csv(path, usecols=use_column, iterator=True, chunksize=5000000)  # gives TextFileReader
df = pd.concat(tp, ignore_index=True)
print(df.count)
print (df["tip_amount"].mean())
print("%s seconds" % ((time.time())-(start_time)))

测试 3 dask 数据帧:54.183971881866455 秒


import dask.dataframe as dd
import time
start_time = time.time()
s3 = boto3.client('s3')
df = dd.read_csv(path)
df = df['tip_amount'] 
cols=['tip_amount']
dfp = df.compute()
print(len(dfp))
print (dfp.mean())
print("%s seconds" % ((time.time())-(start_time)))

【问题讨论】:

  • 您应该衡量仅下载需要多少时间,这应该是带宽有限的,即,无法绕过该成本。
  • 旁注:您可以使用 Amazon Athena 来处理文件,而不是在 Python 程序中处理文件。您可以向 Athena 提供 SQL 查询,它可以在 S3 中对数据执行查询,而无需下载数据。您也可以从您自己的 Python 程序中调用 Athena。 (Athena 使用 Presto 技术执行快速的并行查询。)

标签: python pandas csv amazon-s3 dask


【解决方案1】:

这一行

dfp = df.compute()

是 dask 的反模式。您拆分负载,btu 然后通过连接在内存中形成一个大数据帧。您最好在原始块上计算您想要的内容(请注意,len 在 python 中是特殊的,所以它没有那么整洁

dask.compute(df.shape[0], df.mean())

此外,对于某些工作负载,即使在单台机器上,您也可能会发现分布式调度程序的性能更好。在这种情况下,我相信大部分工作都是无 GIL 的,这是关键的考虑因素。尽管如此,还是值得衡量差异。

附加:如果您真的只想要一列,请在 read_csv 中指定 - 这适用于所有后端!

【讨论】:

  • 感谢您的建议@mdurant!我测试了你的想法,它比我的第三次测试花了一点时间( read_csv 只是我需要的列,并从上面使用了 dask.compute (df.shape[0],df.mean()) ......我有点混淆,因为你说的都是有道理的,它至少应该节省几秒钟......
猜你喜欢
  • 2014-11-03
  • 2017-04-15
  • 1970-01-01
  • 2021-09-12
  • 2019-11-12
  • 2018-08-04
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多