Подтвердить что ты не робот

S3: Как сделать частичное чтение/поиск без скачивания полного файла?

Хотя они похожи на файлы, объекты в Amazon S3 на самом деле не являются "файлами", точно так же, как ведра S3 на самом деле не являются каталогами. В системе Unix я могу использовать head для предварительного просмотра первых нескольких строк файла, независимо от того, насколько он большой, но я не могу сделать это на S3. Итак, как мне сделать частичное чтение на S3?

4b9b3361

Ответ 1

Файлы S3 могут быть огромными, но вам не нужно извлекать всю вещь только для чтения первых нескольких байтов. S3 API поддерживают заголовок HTTP Range: (см. RFC 2616), которые принимают аргумент диапазона байтов.

Просто добавьте заголовок Range: bytes=0-NN к вашему S3-запросу, где NN - запрашиваемое количество прочитанных байтов, и вы будете извлекать только эти байты, а не читать весь файл. Теперь вы можете просмотреть этот CSV файл объемом 900 ГБ, который вы оставили в ведро S3, не дожидаясь загрузки всего файла. Прочитайте полный GET Object docs в документах разработчиков Amazon.

Ответ 2

В AWS.Net SDK отображаются только фиксированные диапазоны (RE: public ByteRange(long start, long end)). Что делать, если я хочу начать посередине и читать до конца? Диапазон HTTP Range: bytes=1000- вполне приемлем для "начала с 1000 и чтения до конца". Я не верю, что они допустили это в библиотеке .Net.

Ответ 3

Используя Python, вы можете просмотреть первые записи сжатого файла.

Подключитесь с помощью boto.

#Connect:
s3 = boto.connect_s3()
bname='my_bucket'
self.bucket = s3.get_bucket(bname, validate=False)

Прочитать первые 20 строк из сжатого файла gzip

#Read first 20 records
limit=20
k = Key(self.bucket)
k.key = 'my_file.gz'
k.open()
gzipped = GzipFile(None, 'rb', fileobj=k)
reader = csv.reader(io.TextIOWrapper(gzipped, newline="", encoding="utf-8"), delimiter='^')
for id,line in enumerate(reader):
    if id>=int(limit): break
    print(id, line)

Так что это эквивалент следующей команды Unix:

zcat my_file.gz|head -20