gpt4 book ai didi

java - BufferedReader 如何从 S3 读取文件?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:10 25 4
gpt4 key购买 nike

我在 AWS S3 中有一个非常大的文件(几 GB),我只需要文件中满足特定条件的少量行。我不想将整个文件加载到内存中,然后搜索并打印那几行——这样做的内存负载会太高。正确的方法是只加载内存中需要的那些行。

根据 AWS 文档 to read from file :

fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key));
displayTextInputStream(fullObject.getObjectContent());

private static void displayTextInputStream(InputStream input) throws IOException {
// Read the text input stream one line at a time and display each line.
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println();
}

这里我们使用 BufferedReader .我不清楚这里下面发生了什么。

我们是否在每次读取新行时都对 S3 进行网络调用,并且只将当前行保留在缓冲区中?还是将整个文件加载到内存中,然后由 BufferedReader 逐行读取?还是介于两者之间?

最佳答案

您所链接的文档中已经给出了您问题的其中一个答案:

Your network connection remains open until you read all of the data or close the input stream.

BufferedReader 不知道它读取的数据来自哪里,因为您正在将另一个 Reader 传递给它。 BufferedReader 创建一个特定大小的缓冲区(例如 4096 个字符),并在开始分发 的调用数据之前通过从底层 Reader 读取来填充此缓冲区read()read(char[] buf)

您传递给 BufferedReaderReader 是 - 顺便说一句 - 使用另一个缓冲区为自己进行从 byte 的转换 -基于流到基于 char 的阅读器。它的工作方式与 BufferedReader 相同,因此通过读取传递的 InputStream 来填充内部缓冲区,这是您的 S3 返回的 InputStream -客户。

如果您尝试从流中加载数据,此客户端中究竟发生了什么取决于实现。一种方法是保持打开一个网络连接,您可以根据需要从中读取,或者可以在读取一大块数据后关闭网络连接,并在您尝试获取下一个数据时打开一个新连接。

上面引用的文档似乎说我们在这里遇到了前一种情况,所以:不,调用 readLine 不会导致单个网络调用。

然后回答您的其他问题:不,S3 客户端返回的 BufferedReaderInputStreamReader 和很可能是 InputStream 是没有将整个文档加载到内存中。这将首先与使用流的整个目的相矛盾,S3 客户端可以简单地返回一个 byte[][] 来代替(绕过每个 byte 2^32 字节的限制-array)

编辑:最后一段有一个异常(exception)。如果整个千兆字节的大文档没有换行符,调用 readLine 实际上会导致将整个数据读入内存(很可能会导致 OutOfMemoryError)。在回答您的问题时,我假定使用的是“常规”文本文档。

关于java - BufferedReader 如何从 S3 读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51505857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com