Разделите и скопируйте файл из корзины в другую, не загружая ее локально - PullRequest
1 голос
/ 07 июня 2019

Я бы хотел разбить и скопировать огромный файл из корзины (gs://$SRC_BUCKET/$MY_HUGE_FILE) в другую корзину (gs://$DST_BUCKET/), но без локальной загрузки файла . Я ожидаю сделать это, используя только gsutil и команды оболочки.

Я ищу что-то с тем же окончательным поведением, что и следующие команды:

gsutil cp gs://$SRC_BUCKET/$MY_HUGE_FILE my_huge_file_stored_locally

split -l 1000000 my_huge_file_stored_locally a_split_of_my_file_

gsutil -m mv a_split_of_my_file_* gs://$DST_BUCKET/

Но, поскольку я выполняю эти действия на виртуальной машине Compute Engine с ограниченной емкостью дискового пространства, локально получить огромный файл невозможно (и в любом случае это выглядит как трата пропускной способности сети).

Файл в этом примере разделен по количеству строк (-l 1000000), но я приму ответы, если разделение выполнено по количеству байтов.

Я посмотрел на документы о потоковой загрузке и загрузке, используя gsutil , чтобы сделать что-то вроде:

gsutil cp gs://$SRC_BUCKET/$MY_HUGE_FILE - | split -1000000 | ...

Но я не могу понять, как загружать разделенные файлы напрямую в gs://$DST_BUCKET/, не создавая их локально (хотя временно можно создать только 1 осколок для передачи).

1 Ответ

2 голосов
/ 07 июня 2019

Этого нельзя сделать без загрузки, но вы можете использовать диапазонное считывание для создания фрагментов без одновременной загрузки полного файла, например,

gsutil cat -r 0-10000 gs://$SRC_BUCKET/$MY_HUGE_FILE | gsutil cp - gs://$DST_BUCKET/file1
gsutil cat -r 10001-20000 gs://$SRC_BUCKET/$MY_HUGE_FILE | gsutil cp - gs://$DST_BUCKET/file2
...
...