【发布时间】: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