【问题标题】:Slow 5 kbps uploads to Google Cloud Storage from Android从 Android 向 Google Cloud Storage 上传速度慢 5 kbps
【发布时间】: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


【解决方案1】:

我的问题有两个。

1) 我没有使用 com.google.api.client.http.javanet.NetHttpTransport,而是使用了 com.google.api.client.http.apache.ApacheHttpTransport,发现速度提高了大约 5 倍。

这还解决了一个单独的问题,即我在进行 GCS 传输后立即尝试使用 Google Cloud Endpoints(带有 NetHttpTransport)时遇到套接字错误。

2) 尝试在使用 ADB 进行调试时运行上传导致了其余的差异。使用 ApacheHttpTransport 在非调试模式下运行使我的传输速度达到了大约 1.4 Mbps,而我的本地网络的容量约为 1.8 Mbps。

顺便说一句,我尝试使用 JetS3t 但遇到了这个确切的问题:IncompatibleClassChangeError exception is thrown when using JetS3t on Android

【讨论】:

  • Google APIs Java 客户端库中也存在问题。用 ApacheHttpTransport 替换 GoogleNetHttpTransport 解决了上传速度问题。
  • 即使在切换到 ApacheHttpTransport 之后,也存在相当的时间差异......如果我从 chrome 浏览器直接上传图片直接谷歌存储,平均需要 3.5 秒.. 而通过代码平均需要 8 秒.. . 对此有任何想法..我使用相同的上述代码没有进度监听器
猜你喜欢
  • 1970-01-01
  • 2019-06-04
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多