Как открыть файл из облачного хранилища Google в облачной функции - PullRequest
0 голосов
/ 14 октября 2018

Вот как обычно я загружаю файл 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 поддерживается, но я не был уверен, как применить его к вышеуказанному случаю.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

На момент написания этой статьи стандартная библиотека Google Cloud Client не поддерживает потоковую загрузку / загрузку.

Посмотрите на GCSFS .Будьте осторожны, вам может потребоваться реализовать стратегию повторных попыток в случае потери соединения.

0 голосов
/ 15 октября 2018

Вы можете быть в состоянии достичь чего-то близкого к вашему примеру № 1, используя облачное хранилище XML API .

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

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

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

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

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

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

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

Пример

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

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

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

Подробности реализации

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

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

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

...