Хотя они похожи на файлы, объекты в Amazon S3 на самом деле не являются "файлами", точно так же, как ведра S3 на самом деле не являются каталогами. В системе Unix я могу использовать head
для предварительного просмотра первых нескольких строк файла, независимо от того, насколько он большой, но я не могу сделать это на S3. Итак, как мне сделать частичное чтение на S3?
S3: Как сделать частичное чтение/поиск без скачивания полного файла?
Ответ 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