toy*_*toy 4 java amazon-s3 amazon-web-services guava
我有一个程序,它将从亚马逊s3读取文本文件,但文件大约400M.我增加了我的堆大小,但我仍然得到Java堆大小错误.所以,我不确定我的代码是否正确.我正在使用Amazon SDK for java和Guava来处理文件流.
请帮忙
S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, folder + filename));
final InputStream objectData = object.getObjectContent();
InputSupplier supplier = CharStreams.newReaderSupplier(new InputSupplier() {
@Override
public InputStream getInput() throws IOException {
return objectData;
}
}, Charsets.UTF_8);
String content = CharStreams.toString(supplier);
objectData.close();
return content;
我为我的JVM使用此选项.-Xms512m -Xmx2g.我使用ant来运行主程序,所以我也将jvm选项包含在ANT_OPTS中.但它仍然无法正常工作.
点InputSupplier虽然你应该使用- ByteSource而CharSource这些天-是你永远不应该有机会获得InputStream来自外部的,所以你不必记得关闭与否.
如果您之前使用的是旧版本的Guava ByteSource并且CharSource已经推出,那么这应该是
InputSupplier supplier = CharStreams.newReaderSupplier(new InputSupplier() {
@Override
public InputStream getInput() throws IOException {
S3Object object = s3Client.getObject(
new GetObjectRequest(bucketName, folder + filename));
return object.getObjectContent();
}
}, Charsets.UTF_8);
String content = CharStreams.toString(supplier);
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Guava 14,那么这可以更流利地完成
new ByteSource() {
@Override public InputStream openStream() throws IOException {
S3Object object = s3Client.getObject(
new GetObjectRequest(bucketName, folder + filename));
return object.getObjectContent();
}
}.asCharSource(Charsets.UTF_8).read();
Run Code Online (Sandbox Code Playgroud)
也就是说:您的文件可能是400MB,但Java String存储为UTF-16,可以轻松地将内存消耗增加一倍.您可能需要更多内存,或者需要找到一种方法来避免将整个文件同时保留在内存中.
您可以按部分读取文件,而不是将整个文件放入内存中,这样您的整个文件就不会在内存中。避免将整个文件放在内存中,以免因内存有限而出现内存问题
GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, key);
rangeObjectRequest.setRange(0, 1000); // retrieve 1st 1000 bytes.
S3Object objectPortion = s3Client.getObject(rangeObjectRequest);
InputStream objectData = objectPortion.getObjectContent();
Run Code Online (Sandbox Code Playgroud)
//现在进入循环并通过从s3读取内容并在循环中追加文件来在本地制作文件,因此内存中不会有全部内容
| 归档时间: |
|
| 查看次数: |
6900 次 |
| 最近记录: |