私は、AWS S3で非常に大きなファイル(数GB)を持っている、と私は、特定の条件を満たしたファイル内の行の数が少ないが必要です。このため、メモリの負荷が高すぎるだろう - 私は、メモリ内のファイル全体をロードし、その後を検索し、それらのいくつかの行を印刷しません。正しい方法は必要とされ、メモリ内のこれらの行を読み込むことであろう。
AWSのドキュメントごとにファイルから読み取ります。
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のでライン・バイ・ラインを読みますか?それとも間のどこかにありますか?
あなたの質問の答えの一つは、すでにリンクされたドキュメントに記載されています。
あなたは、データまたは近い入力ストリームのすべてを読むまで、あなたのネットワーク接続は開いたまま。
Aは、BufferedReader
あなたが別のものを渡しているので、それは読み込みデータがどこから来ている知っていないReader
ことに。Aは、BufferedReader
特定のサイズ(例えば、4096文字)のバッファを作成し、根底から読み出すことにより、このバッファを満たすReader
の呼のデータ配っを開始する前に、read()
またはread(char[] buf)
。
Reader
あなたがに渡すのBufferedReader
である-によって-自体はからの変換行うための別のバッファ使用byte
するベースのストリームchar
ベースのリーダーを。それはと同じように動作するBufferedReader
内部バッファが渡されるから読み込むことで満たされているので、InputStream
しているInputStream
あなたのS3-クライアントによって返されました。
あなたは、ストリームからの負荷データにしようとすると、まさにこのクライアント内で起こるかは実装依存です。一つの方法は、オープン1のネットワーク接続を維持するだろうとあなたが望むまたはデータのチャンクが読み込まれた、あなたが次のいずれかを取得しようとすると、新しいものが開かれた後、ネットワーク接続を閉じることができて、あなたはそれから読み取ることができます。
上記引用されたドキュメントはそう、私たちはここにかつての状況を持っていると言っているようだ:いいえ、の呼び出しはreadLine
、単一のネットワーク呼び出しにつながるされていません。
そして、あなたの他の質問に答えるために:いいえ、BufferedReader
、InputStreamReader
最も可能性の高いInputStream
S3-クライアントから返されたメモリに、ドキュメント全体にロードされていません。すなわち、最初の場所でストリームを使用して全体の目的と矛盾なり、S3クライアントは単に返すことができbyte[][]
(2 ^ 32バイトあたりの制限を回避来る代わりにbyte
-array)
編集:最後の段落の例外があります。全体ギガバイトの大きな文書は一切改行を持っていない場合は、呼び出しはreadLine
、実際にメモリに全データの読み出し(最も可能性の高いOutOfMemoryErrorが発生する)につながります。あなたの質問に答えながら、私は「通常の」テキストドキュメントを想定しました。