Как открыть файл из облачного хранилища Google в облачной функции

1

Вот как я обычно загружаю файл GCS на локальный:

storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
blob.download_to_filename('myBigFile.txt)

Файлы, с которыми я работаю, намного больше, чем допустимый размер/память облачных функций (например, несколько ГБ для нескольких ТБ), поэтому вышеупомянутое не будет работать для этих больших файлов.

Существует ли более простая "потоковая передача" (см. Пример 1 ниже) или "прямой доступ" (см. Пример 2 ниже) для работы с файлами GCS в облачной функции?

Два примера того, что я хотел бы сделать, это:

# 1. Load it in chunks of 5GB -- "Streaming"
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
while True:
    data = blob.download_to_filename('myBigFile.txt', chunk_size=5GB)
    do_something(data)
    if not data: break

Или же:

# 2. Read the data from GCS without downloading it locally -- "Direct Access"
storage_client = storage.Client()
bucket = storage_client.get_bucket('mybucket')
blob = bucket.blob('myBigFile.txt')
with blob.read_filename('myBigFile.txt') as f:
    do_something(f)

Я не уверен, что это возможно, но я оставляю несколько вариантов того, как это может работать. Кажется, что поддерживается Streaming Option, но я не был уверен, как применить его к вышеуказанному делу.

  • 0
    Не могли бы вы прокомментировать, как вы планируете использовать данные, содержащиеся в объектах корзины облачного хранилища, внутри вашей функции? Возможно, если бы мы знали, как используются данные, мы могли бы предложить лучшее руководство?
  • 0
    @Kolban Я только что обновил вопрос с парой примеров. Я сохраняю данные либо в новый тип файла (например, avro), либо вставляю их в базу данных.
Показать ещё 1 комментарий
Теги:
google-cloud-platform
google-cloud-storage
google-cloud-functions

1 ответ

1
Лучший ответ

Возможно, вы сможете достичь чего-то близкого к вашему примеру # 1, используя XML-интерфейс Cloud Storage.

Не должно быть проблем с реализацией его в облачных функциях, поскольку оно полностью основано на стандартных HTTP-запросах.

Вероятно, вы ищете запрос объекта GET для загрузки объекта:

Запросы GET для объектов могут включать заголовок Range, как определено в HTTP 1.1 RFC, чтобы ограничить область возвращаемых данных в объекте, но имейте в виду, что в определенных обстоятельствах заголовок диапазона игнорируется.

Этот заголовок HTTP Range может использоваться для реализации "кусков", которые вы ищете (но как автономные запросы, а не в режиме "потоковой передачи"):

Диапазон байтов, который вы хотите вернуть в ответ, или диапазон байтов, которые были загружены в систему Cloud Storage.

Допустимые значения

Любой смежный диапазон байтов.

пример

Range: bytes=0-1999 (первые 2000 байт)

Range: bytes=-2000 (последние 2000 байт)

Range: bytes=2000- (от байта 2000 до конца файла)

Детали реализации

Облачное хранилище не обрабатывает сложные непересекающиеся диапазоны, но поддерживает простые смежные диапазоны байтов. Кроме того, диапазоны байтов являются включительно; то есть bytes = 0-999 представляют первые 1000 байтов в файле или объекте. Действительный и успешный запрос приведет к 206 частичного кода ответа на контент. Для получения дополнительной информации см. Спецификацию.

Поскольку диапазоны будут статичными, вряд ли вы сможете найти значения диапазонов, которые точно соответствуют, чтобы куски полностью соответствовали сохраненным "границам" данных. Таким образом, вам может потребоваться выбрать куски, перекрывающие бит, чтобы иметь возможность собирать данные, которые в противном случае будут разделены на 2 куска.

Примечание. Я не пробовал это, ответ основывается исключительно на документах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню