我正在使用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
但它并不好看。清洁。有更好的方法吗?