【问题标题】:What is the best practice for downloading large CSV files from S3 in Java?在 Java 中从 S3 下载大型 CSV 文件的最佳做法是什么?
【发布时间】:2019-09-18 17:10:34
【问题描述】:

我正在尝试从 S3 获取一个大型 CSV 文件,但下载失败并显示“java.net.SocketException: Connection reset”,这可能是由于 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-s3 aws-java-sdk


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2021-10-31
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多