Запись потокового в Google Cloud Storage в Python - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь перенести функцию AWS Lambda, написанную на Python, на CF,

  1. распаковывает на лету и читает построчно
  2. выполняет некоторые преобразования света в каждой строке
  3. запись вывода (строка за раз или порции) без сжатия в GCS

Выходная информация> 2 ГБ - но чуть меньше 3 ГБ, поэтому она подходит для Lambda, , всего .

Что ж, кажется невозможным или куда более вовлеченным в GCP:

  • несжатый не может поместиться в памяти или /tmp - ограничен 2048 МБ на момент написания этой статьи, поэтому Python Client lib upload_from_file (или _filename) не может использоваться
  • есть эта официальная статья, но, к моему удивлению, она ссылается на boto, библиотеку, изначально предназначенную для AWS S3, и довольно устаревшую, поскольку boto3 уже давно отсутствует. Нет подлинного GCP метода для потоковой записи или чтения
  • У Node.js есть простая createWriteStream() - хорошая статья здесь Кстати - но нет эквивалентной строки в Python
  • Возобновляемая загрузка мультимедиа звучит так, но много кода для того, что обрабатывается в Node, гораздо проще
  • AppEngine имел облачного хранилища , но недоступно за его пределами - и устарел
  • Пример практически отсутствует на работающей оболочке для построчной записи текста / простых данных, как если бы GCS была локальной файловой системой. Это не ограничивается Cloud Functions и отсутствием функции клиентской библиотеки Python, но более остро в CF из-за ограниченности ресурсов. Кстати, я был частью обсуждения , чтобы добавить функцию IOBase, доступную для записи, но она не имела тяги.
  • очевидно, что использование виртуальной машины или DataFlow не подходит для рассматриваемой задачи.

На мой взгляд, потоковое (или потоковое) чтение / запись из облачного хранилища должно быть даже включено в стандартную библиотеку Python.

Как и было рекомендовано, можно по-прежнему использовать GCSFS , который за кулисами фиксирует загрузку кусками для вас, пока вы пишете материал в FileObj. Та же команда написала s3fs. Я не знаю, для Azure.

AFAIC, я буду придерживаться AWS Lambda, поскольку вывод может уместиться в памяти - пока - но многочастная загрузка - это способ поддержать любой размер вывода с минимумом памяти.

Мысли или альтернативы?

1 Ответ

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

Я запутался с multipart против resumable загрузки. Последнее - то, что вам нужно для «потоковой передачи» - это больше похоже на загрузку фрагментов буферизованного потока.

Multipart загрузка - загрузка данных и пользовательских метаданных одновременно в одном вызове API.

Хотя мне очень нравится GCSFS - Мартин , его основной вкладчик очень отзывчив - я недавно нашел альтернативу , которая использует google-resumable-media библиотека.

GCSFS построен на основе основного HTTP API, тогда как в решении Сета используется низкоуровневая библиотека, поддерживаемая Google, которая в большей степени синхронизируется с изменениями API и включает экспоненциальное резервное копирование. Последний действительно необходим для большого / длинного потока, так как соединение может оборваться, даже в пределах GCP - мы столкнулись с проблемой GCF.

В заключительной заметке я все еще считаю, что Облачная библиотека Google - это подходящее место для добавления потоковой функциональности с базовыми write и read. Он имеет код ядра уже .

Если вам также интересна эта функция в базовой библиотеке, то проблема будет решена здесь - при условии, что приоритет основан на ней.

...