amazon-s3 - 在 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记录“批量下载”的最佳实践方式?
解决方案
我决定简单地使用专用getObject(GetObjectRequest getObjectRequest, File destinationFile)
方法将整个 CSV 复制到磁盘上的临时文件中。这会尽快关闭 HTTP 连接,并允许我从本地文件中毫无问题地获取 InputStream。它并没有解决批量下载的最佳方式的问题,但它是一个很好且简单的解决方法。
推荐阅读
- python - 如何使用 Python 从字符串中提取特定路径?
- visual-studio-code - 我可以将 VS Code 配置为具有多个实例,例如处理不同的项目吗?
- python - 尝试使用 Pycharm 生成的套接字来拉取同一目录中的 HTML 文件的内容
- types - 来自记录规则的 Prometheus 指标
- windows - Active Directory 存储的加入域的 Windows 计算机的 objectGUID 或 ObjectSID 是否也存储在本地?
- python - 如何使用 Python 在 Anki Deck 上放置卡片
- python - ModuleNotFoundError:没有名为“SessionState”的模块
- reactjs - AsyncTypeahead 文本框应在退格上清除
- inno-setup - 使用 AppId 卸载使用 Inno Setup 安装的程序,以防卸载程序 exe 丢失
- ios - 删除不存在的密钥时,Firebase 数据库不返回错误