Чтение gz-файлов из AWS S3 по частям

Я использую gzipfile для распаковки данных, частично избегая проверки CRC. Вот код, который у меня есть:

s3FileObject = s3.get_object(Bucket='<<myBucket>>', Key='<<myKey>>')
print "Memory Used (KiB): ", process.memory_info().rss/(1024)
bytestream = BytesIO(s3FileObject['Body'].read(1024))
print s3FileObject['ContentLength']
Beg=process.memory_info().rss/(1024)
print "Memory Used (KiB): ", process.memory_info().rss/(1024)
got_text = GzipFile(None, 'rb', fileobj=bytestream).read(2048).decode('utf-8')
print "Final Memory (KiB): ", process.memory_info().rss/(1024), "Memory Increase in (KiB): ", process.memory_info().rss/(1024) - Beg
print "len(got_text): ", len(got_text)

Здесь я хочу запустить этот код в AWS lambda, поэтому я не хочу расширять весь файл, а только его часть. Поэтому я тестирую только 1024 байта, прочитанных из файла gzip.

bytestream = BytesIO(s3FileObject['Body'].read(1024))

Если я удалю 1024 как s3FileObject['Body'].read() затем используемая память значительно увеличивается. Теперь, когда у меня есть раздел данных, я хочу полностью распаковать его. так что мне не нужно отслеживать, сколько сжатых данных обрабатывается.

Таким образом, проблема здесь состоит в том, чтобы прочитать все несжатые байты. Если я использую read() тогда это терпит неудачу с ошибкой CRC.

got_text = GzipFile(None, 'rb', fileobj=bytestream).read(2048).decode('utf-8')

Как получить количество символов без сжатия или без чтения CRC?

Возможно, это можно сделать с помощью бинарного поиска для маркера eof -

gzFileObj = GzipFile(None, 'rb', fileobj=bytestream)
blobsize=1024
readBytes=0
while 1:
    try:
        print blobsize, readBytes
        gzFileObj.read(blobsize).decode('utf-8')
    except (IOError, StopIteration):
        if blobsize == 1:
            gzFileObj.close()
            break
        else:
            gzFileObj.seek(readBytes)
            blobsize = blobsize/2
            continue
    readBytes = readBytes + blobsize

Но это не красиво и чисто. Есть лучший способ сделать это?

0 ответов

Другие вопросы по тегам