从s3桶中读取许多小文件



我有几千个csv文件,每个文件都很小。

现在我正在使用for循环和pandas .read_csv()遍历文件。与实际下载速度和文件大小相比,这非常慢。

我怀疑在后台有一些开销,比如打开连接。

有什么方法可以使这种方法更有效吗?

如果您可以访问更多AWS服务,您可以做什么

主要的问题是通过互联网获取成千上万的小文件不是很有效。以某种方式压缩这些文件然后处理一个更大的文件会更有效。

您可以在Glue Data Catalog中创建一个表,指向S3中文件的位置和结构,并使用Athena执行select * from table_name。Athena将读取所有小文件,并在S3上将CSV输出到您选择的位置,您只需为您读取的数据量付费。

如果你只能使用Python脚本

我怀疑你的代码有严重的io瓶颈,也就是说,它花了大部分时间等待S3的响应,而不是实际计算一些东西。您可以通过并行化S3的读取操作来优化这一点。

考虑到您的I/O有限,我将研究aioboto3,它允许您在Python中使用async/await进行AWS SDK调用。它应该非常适合这个用例。一开始可能有点烦人,但我最近写了一篇关于这个主题的博客文章,如果你感兴趣的话(通常的免责声明:由我写的,与主题相关)。

如果您想坚持使用标准库,那么您可能会对多处理和线程模块感兴趣。如果瓶颈是CPU时间而不是I/o,这些通常更好。

最新更新