io.Копировать против gsutil — копирование больших файлов в GS

# #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