从AWS S3中部分读取gz文件

时间:2018-03-16 20:28:47

标签: python aws-lambda gzipfile

我正在使用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中运行此代码,所以我不想扩展整个文件,只是扩展它的一部分。因此,我只测试了gzip文件的1024字节读数。

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

如果删除像s3FileObject['Body'].read()这样的1024,则使用的内存会显着跳跃。现在我有一部分数据我想完全解压缩。这样我就不需要跟踪处理的压缩数据量了。

所以这里的问题是读取所有未压缩的字节。如果我使用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 个答案:

没有答案