我正在尝试从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记录批量下载的最佳实践?
发布于 2019-09-20 23:24:40
我决定简单地使用专用的getObject(GetObjectRequest getObjectRequest, File destinationFile)方法将整个CSV复制到磁盘上的一个临时文件中。这将尽快关闭HTTP连接,并允许我从本地文件中毫无问题地获取InputStream。它没有解决批量下载的最佳方式的问题,但它是一个很好的简单的变通方法。
https://stackoverflow.com/questions/57997770
复制相似问题