2016-05-23 18 views
2

JavaでGoogle Cloud Storage APIを使用する際に問題が発生しました。 GCPインスタンスでは次のようなことが起こるため、すべてがGoogleのネットワーク内にあります。基本的に、大きなzipファイルをダウンロードするには、gsutilは非常に高速ですが、Javaコードも同様の作業を行うのが非常に遅く、おそらく10倍です。参考のために、これは同等のgsutilコマンドです。Google Cloud Storageからダウンロードgsutilよりも遅いJava API

gsutil cp gs://mybucket/myfile.zip . 

かなり基本的な、クレイジーなオプションはありません。しかし、多かれ少なかれ同じことを行う必要があり、Javaコードは、遠くに遅いです:

 FileOutputStream fos = new FileOutputStream("myfile.zip"); 
     Storage.Objects.Get get = storageService.objects().get("mybucket", "myfile.zip"); 
     get.setDisableGZipContent(true); //Seems to have no effect 
     MediaHttpDownloader downloader = get.getMediaHttpDownloader(); 
     downloader.setDirectDownloadEnabled(true); //Seems to have no effect 
     get.executeMediaAndDownloadTo(fos); 

これは信じられないほど遅いですなぜ私は理解していません。愚かではあるが悲しいテストで、問題を解決するために、私はgsutilを別の端末ウィンドウで実行していましたが、Javaコードはまだ動いていませんでした。gsutilはJavaコードよりも先に同じファイルをダウンロードしました。恥ずかしいほど遅いです。これらは私がGoogleからの使用しているライブラリです: - どちらも目立った効果として

<dependency> 
     <groupId>com.google.api-client</groupId> 
     <artifactId>google-api-client</artifactId> 
     <version>1.21.0</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.apis</groupId> 
     <artifactId>google-api-services-storage</artifactId> 
     <version>v1-rev66-1.21.0</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.google.http-client</groupId> 
     <artifactId>google-http-client</artifactId> 
     <version>1.21.0</version> 
     <scope>compile</scope> 
    </dependency> 

私は(私たちはzipファイルをダウンロードしていることから、それはすでに圧縮されます)setDirectDownloadEnabled()setDisableGZipContent()するためのオプションを変更しようとしました。

+0

"極端に遅い"を定量できますか? 100メガバイトのオブジェクトをダウンロードするのに何秒かかりますか? gsutilはどれくらいかかりますか? –

+1

私は500MBで70秒ほど遅く見えました。 gsutilは約2-3で終了する。 – PatrickB

答えて

0

gsutilのが速くなり2つの主な理由があります。一度にデフォルト32MBによってバイトの

  1. MediaHttpDownloaderダウンロードチャンクが、。したがって、32MBごとに、クライアントがサービス応答を待つ間に余分な往復が必要となります。

  2. デフォルトでは、gsutilはオブジェクトをmultiple slicesに分割し、各スライスをパラレルにダウンロードします。これにより、シングルストリームの帯域幅や接続の制限が回避されます。

あなたのコードはGCPの内部にあるので、ネットワークはそれほど重要ではありませんが、依然として要素です。私はそれが10倍の劣化を説明しているとは思わないので、あなたが見ている正確な転送速度を明確にすることは有用です。

+0

1)直接ダウンロードは、1つの要求としてすべてをダウンロードしようとします。 2)ドキュメントから「スライスされたオブジェクトのダウンロードを使用するには、コンパイル済みのcrcmodが必要です」 - これはインストールされていない(警告が表示される)ので、スライスされたダウンロードが行われているということはできません。 – PatrickB

+0

1)に同意しますが、これはApp Engineの制限だと思います。それにもかかわらず、特にスライスされたダウンロードが使用されていないので、これはパフォーマンスのこのような大きな違いを説明しません。 –

関連する問題