【发布时间】:2021-12-28 15:20:06
【问题描述】:
我想使用 gzip 将记录打包到 io.ByteIO 列表中。我想为每个我不想超过的包设置一个 max_size。问题是在我这样做之前,我不知道我是否会用新记录超过这个大小。一旦它超过了大小,我就没有一个好的方法来撤消这个添加。
def pack_gz_records(records: List[any], max_size: int) -> List[io.BytesIO]:
packets = []
mem_file = io.BytesIO()
gz = gzip.GzipFile(fileobj=mem_file, mode="w")
for record in records:
if gz.size >= max_size:
# Size exceeded limit. Add this mem file to the package and cut a new mem file
mem_file.seek(0)
packets.append(mem_file)
mem_file = io.BytesIO()
gz = gzip.GzipFile(fileobj=mem_file, mode="w")
gz.write(serialize(record))
if gz.size:
mem_file.seek(0)
packets.append(mem_file)
return packets
有没有办法撤消写入,或以有效的方式“窥视”写入,而无需在写入之前复制每条记录的所有字节?
【问题讨论】:
-
我认为在你写之前没有办法知道会写多少。我建议您将限制设置为比您实际想要的低一点,这样稍微超出一点仍然是可以接受的。
-
如果某条记录太大而无法压缩到小于您的最大大小,您会怎么做?
-
@MarkAdler 在我的情况下这将是一个错误,所以我并不担心