【发布时间】: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记录“批量下载”的最佳实践方式?
【问题讨论】: