2016-05-23 2 views
2

У меня возникла проблема с использованием API облачных хранилищ Google на Java. Все это происходит на экземпляре GCP, поэтому все это входит в сеть Google. В принципе, для загрузки больших zip-файлов, gsutil работает очень быстро, но Java-код выполняет аналогичную задачу очень медленно, возможно, в 10 раз. Для справки это будет эквивалентная команда gsutil.Загрузить с Google Cloud Storage Java API медленнее, чем gsutil

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

Pretty basic, no crazy options. Тем не менее, код 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> 

Я попытался изменить параметры для setDirectDownloadEnabled() и setDisableGZipContent() (так как мы скачивание почтового индекса, это уже сжато) - ни как-либо заметный эффект.

+0

Можете ли вы количественно определить «очень медленно»? Сколько секунд требуется для загрузки объекта, скажем, 100 мегабайт? Сколько времени занимает gsutil? –

+1

Я видел как медленный, как 70-х для 500 МБ. gsutil заканчивается примерно в 2-3 раза. – PatrickB

ответ

0

Есть две основные причины, почему GSUtil будет быстрее: скачать

  1. MediaHttpDownloader ломти байт, по умолчанию 32MB в то время. Таким образом, между 32 МБ требуется дополнительная поездка туда и обратно, пока клиент ждет ответа службы.

  2. gsutil по умолчанию разбивает объект на multiple slices и загружает каждый фрагмент параллельно. Это обходит любые ограничения пропускной способности одного канала или соединения.

Поскольку ваш код является внутренним для GCP, сеть должна быть меньше фактора (но она по-прежнему является фактором). Я не думаю, что это объясняет 10-кратное ухудшение, поэтому было бы полезно уточнить точные скорости передачи, которые вы видите.

+0

1) Прямая загрузка должна пытаться загрузить все это как один запрос. 2) Из своих документов «использование загрузок нарезанных объектов также требует скомпилированного crcmod» - у меня нет этого установленного (я получаю предупреждение об этом), поэтому не может быть, что происходит нарезка. – PatrickB

+0

Я согласен с 1), но я думаю, что это ограничение для App Engine. Несмотря на это, особенно, поскольку нарезанные загрузки не используются, это не объясняет столь огромную разницу в производительности. –

Смежные вопросы