首页 > 解决方案 > 在 Java 中从 S3 下载大型 CSV 文件的最佳做法是什么?

问题描述

我正在尝试从 S3 获取一个大的 CSV 文件,但下载失败并显示“java.net.SocketException:连接重置”,这可能是由于 InputStream 只是打开时间过长(下载通常需要一个多小时因为我正在对流媒体内容执行多个耗时的过程)。这是我目前解析文件的方式:

InputStream inputStream = new GZIPInputStream(s3Client.getObject("bucket", "key").getObjectContent());
Reader decoder = new InputStreamReader(inputStream, Charset.defaultCharset());
BufferedReader isr = new BufferedReader(decoder);
CSVParser csvParser = new CSVParser(isr, CSVFormat.DEFAULT);
CSVRecord nextRecord = csvParser.iterator().next();
...

我知道我必须将下载拆分为多个简短的 getObject 调用,并为 GetObjectRequest 定义偏移量,但我想知道如何在 CSV 的情况下定义此偏移量,因为我需要完整的行。

我是否必须放弃解析器库并将每一行解析为一个对象,以便我可以保留读取字节的计数并将其用作下一批的偏移量?这对我来说似乎不是很强大。有没有实现CSV记录“批量下载”的最佳实践方式?

标签: amazon-s3aws-java-sdk

解决方案


我决定简单地使用专用getObject(GetObjectRequest getObjectRequest, File destinationFile)方法将整个 CSV 复制到磁盘上的临时文件中。这会尽快关闭 HTTP 连接,并允许我从本地文件中毫无问题地获取 InputStream。它并没有解决批量下载的最佳方式的问题,但它是一个很好且简单的解决方法。


推荐阅读