Разделение большого файла S3 на строки на файл (не байты на файл) - PullRequest
0 голосов
/ 05 мая 2020

У меня есть файл размером 8 ГБ с текстовыми строками (каждая строка имеет возврат каретки) в S3. Этот файл отформатирован пользователем и НЕ соответствует никакому распространенному формату, например CSV, pipe, JSON ... Мне нужно разбить этот файл на файлы меньшего размера в зависимости от количества строк, так что каждый файл будет содержать 100000 строк или меньше ( предполагая, что последний файл может иметь остаток строк и, следовательно, может содержать менее 100000 строк).

  1. Мне нужен метод, который основан не на размере файла (т.е. байтах), а на количестве линий. Файлы не могут иметь одну строку, разделенную на две части.
  2. Мне нужно использовать Python.
  3. Мне нужно использовать AWS службу без сервера, такую ​​как Lambda, Glue .. . Я не могу раскручивать экземпляры, такие как EC2 или EMR.

До сих пор я нашел много сообщений, показывающих, как разбивать по размеру байтов, а не по количеству строк. Кроме того, я не хочу читать этот файл построчно, так как он будет слишком медленным и неэффективным. 1011

Я ищу все возможные варианты, пока выполняются базовые c требования, указанные выше ...

БОЛЬШОЕ спасибо!

Майкл

1 Ответ

1 голос
/ 05 мая 2020
Метод

boto3.S3.Client.get_object() предоставляет в качестве ответа объект типа StreamingBody.

StreamingBody.iter_lines() документация по методу гласит:

Возврат итератора для вывода строк из необработанного потока.

Это достигается путем чтения блока байтов (размером chunk_size) за раз из необработанного потока, а затем выдавая строки оттуда.

Это может соответствовать вашему варианту использования. Общая идея состоит в том, чтобы обеспечить потоковую передачу огромных файлов и обрабатывать их содержимое по мере поступления. Я не могу придумать, как это сделать, не прочитав каким-то образом файл.

...