首页 > 解决方案 > 在python中将文件分块为可变大小的读取

问题描述

我正在尝试以不同大小的块读取文件以计算文件 etag 并与 s3 资源上的 etag 进行比较。

我意识到这是一个以前被问过的问题,但是我所看到的所有答案都涉及通过处理保持一致的甚至大小的分块。

我想要做的是获取任何大小的文件,对于该文件的前 5GB,计算每个 5MB 块的 md5。然后对于接下来的 25GB 文件,计算每个 25MB 块的 md5。对于文件的最终数量,计算每个 125MB 块的 md5。

我相信这可以分解为: 1000 个 5MB 到 5GB 的块 接下来 1000 个 25MB 到 25GB 的块(或读取到 30GB) 最后 8000 个 125MB 的块,每个最多 1TB

S3 协议将块的数量限制为最大 10000。

所以对于一个 49.9 GB 的文件,我最终会连接 2136 个部分并计算 md5。

原因是上传到 s3 设备是使用基于此分块方案上传的 Goofys 完成的。

我尝试使用嵌套的 while 循环(我的条件没有按预期工作),而我目前的尝试是使用 if 语句......

我迷路的地方是确保 file.read(chunk_size) 在达到大小阈值时发生变化,直到读取整个文件。

标签: python-3.xamazon-s3

解决方案


S3 实际上存储带有在上传期间创建的标头的部分,包括 ETag。您可以使用x-amz-mp-parts-countHeadObject 中未记录的标头,然后partNumber在 GetObject 期间将每个部分与其他未记录的标头一起下载。下载所有部分后,您可以通过计算组合哈希hashlib.md5(b''.join(md5_digest)).hexdigest() + '-' + str(len(md5_digest))。无论哪个客户端创建了对象,此技术都将起作用。参考:

https://github.com/gaul/undocumented-s3-apis#get-object-by-multipart-number


推荐阅读