# #go #google-cloud-storage #gsutil
#Вперед #google-облачное хранилище #gsutil
Вопрос:
После множества тестов мы, похоже, не можем соответствовать скорости gsutil при использовании клиентских библиотек GS Go. Даже скелетный файл с простейшим io.Copy()
занимает НАМНОГО больше времени, чем простейший gsutil.
ctx := context.Background()
client, err := storage.NewClient(ctx, option.WithCredentialsFile(*flags.credsFile))
bucket := client.Bucket("my_bucket")
File, _ := os.Open("path_to_file")
wc := bucket.Object("remoteFile").NewWriter(ctx)
_, _ = io.Copy(wc, File)
err = wc.Close()
Также пробовал, io.CopyBuffer()
когда буфер равен 128×1024, лучше, но все равно медленно.
Есть ли способ ускорить загрузку при использовании go? мы не хотим вызывать какие-либо внешние утилиты…
Комментарии:
1. Мы говорим о загрузке файла в соответствии с вашим примером или перемещении файлов вокруг того, что предлагает @mark? Кроме того, если бы вы могли, по крайней мере, запустить ту же команду, используя gsutin и go program, но просто поставить перед ней префикс time, мы бы знали, на что вы ссылаетесь.
2. Есть две области , где
gsutil
это умнее , чем простоio.Copy
. Первый — это копирование объекта из ведра в ведро. @Mike Schwarts дает хороший ответ. Второй — параллельные загрузки.gsutil
может разбить один файл на несколько сегментов и загружать их параллельно. cloud.google.com/storage/docs /…3. удалось ли вам найти какой-либо способ эффективного копирования больших файлов с помощью библиотеки stand go
storage
?4. @Avishay28 В итоге я использовал gsutil — это волшебно 🙂
Ответ №1:
Это звучит как ио.Реализация копирования не поддерживает GCS и вместо этого выполняет фактические байтовые копии (чтение из исходного файла и запись в целевой файл). Напротив, gsutil вызывает GCS Rewrite API, который для случаев, когда источник и место назначения находятся в одном и том же местоположении и классе хранения, будет копировать только метаданные (избегая копирования байтов). Делать это таким образом намного быстрее, что будет соответствовать тому, что вы наблюдаете, с точки зрения производительности.
Можете ли вы использовать реализацию Go с поддержкой GCS, то есть ту, которая будет вызывать перезапись, а не чтение / запись байтов базового объекта?
Комментарии:
1.Что вы подразумеваете под «вызовом перезаписи», есть какая-то библиотека? из документации я не могу понять, как ее использовать, когда я хочу скопировать локальный файл (который, я полагаю, является вариантом использования OP) — вам нужно указать
sourceBucket
sourceObject
в URL-адресе запроса2. Avishay28 — Я не работал с библиотекой Go, но, глядя на документацию, похоже, что вы хотите использовать функцию CopierFrom: pkg.go.dev/cloud.google.com/go/storage#ObjectHandle . CopierFrom