【发布时间】:2013-12-14 21:34:51
【问题描述】:
我正在编写一个 Android 应用,并希望使用 Google Cloud Storage 来存储可能较大的媒体文件。我正在为 JSON API 使用 Java 客户端库:com.google.api.services.storage。
我的问题是性能。我确定我一定做错了什么。我有文件上传工作,但它几乎是可笑的慢。传输一个 1.5 MB 的图像文件大约需要 5 分钟,所以这大约是 5 kbps,这对于我的应用程序来说是不可用的。我已经为我的应用启用了计费功能,但我处于免费套餐中。这肯定不是预期的性能水平吗?我正在宽带 wifi 上的 Galaxy S4 上对此进行测试。我正在使用服务帐户 OAUth 客户端密钥来访问 GCS。
我尝试过使用和不使用 gzip 编码,使用和不使用直接(不可恢复)上传,以及不同的块大小 - 默认值、最小值、最小值的倍数等。在所有情况下我都得到了相似的结果。这是我的上传功能:
public void uploadFile(String bucketName, String filePath, String mimeType, String gcsFilename, IOProgress ioProgress)
throws IOException {
StorageObject object = new StorageObject();
object.setBucket(bucketName);
File file = new File(filePath);
Long fileSize = file.length();
Log.d(TAG, "uploadFile START: " + bucketName + ":" + gcsFilename + " -> " + filePath);
try (InputStream stream = new FileInputStream(file)) {
InputStreamContent content = new InputStreamContent(mimeType,
stream);
Storage.Objects.Insert insert = storage.objects().insert(
bucketName, null, content);
insert.setName(gcsFilename);
insert.getMediaHttpUploader().setDisableGZipContent(true); // this seems to help to disable... at least when debugging
// insert.getMediaHttpUploader().setDirectUploadEnabled(true);
insert.getMediaHttpUploader().setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE);
if (ioProgress != null) {
insert.getMediaHttpUploader().setProgressListener(new CloudUploadProgressListener(ioProgress, fileSize));
}
insert.execute();
Log.d(TAG, "uploadFile FINISH: " + bucketName + ":" + gcsFilename + " -> " + filePath);
}
}
【问题讨论】:
-
为了比较,请尝试从计算机运行“gsutil -m cp SOME_FILE gs://SOME_BUCKET”,以确认您的网络和 GCS 都可以更快地传输数据。我对 Java 方面不够熟悉,无法真正进行故障排除......但我对“.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE)”很好奇 - 如果使用 very 小块大小,它会转移得很慢。
-
嗨,布赖恩,感谢您的回复。 gsutil 报告从同一 LAN 上传的速度为 220 KBps,这与我预期的差不多。 MINIMUM_CHUNK_SIZE 定义为 256 KB,DEFAULT_ 定义为 10 MB。我看不出两者有任何明显的区别。我还找到了this issue and associated tracker ticket。我打算试试 JetS3t 看看是否有帮助。
标签: android google-cloud-storage google-api-java-client