Чтение 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
Но это не красиво и чисто. Есть лучший способ сделать это?