如何在 运行 内存不足 python3 的情况下将整数列表转换为字节列表?
How to convert list of lists of ints into a list of bytes without running out of memory in python3?
背景有点复杂。所以我们有一个(出于测试目的,在生产中可能更大)1.2GB .zip 文件,我们将其分成块并通过多个 Onionshare 实例发送。一旦接收方收到所有块,它会将它们放入一个列表中,称为内容。由于每个块都是一个整数列表(不知道为什么 onionshare 以整数而不是字节传输),内容是一个整数列表的列表。但是,为了正确保存它,我们需要(据我所知)将其转换为字节列表并使用 b''.join
保存。这是我们的代码:
#Write total content to image.zip
#content is a list of lists of int, but saved value must be a simple list of bytes
#This is what I came up with to convert it to a list of bytes
content2 = []
for i in range (0, threads):
for j in range(0, len(content[i])):
content2.append(bytes(content[i][j]))
#And now it can be saved with a join
open("image.zip", "wb").write(b''.join(content2))
我很确定这应该有效,但是这样做我们 运行 遇到了一个问题,即由于使用太多内存而导致进程被终止。
我们尝试增量写入文件而不是一次全部写入,但出现了同样的问题。所以我认为内存问题是在实际转换过程中发生的。
任何人都可以建议更好的方法吗?
谢谢
您不需要一次转换整个数据集。只需单独转换和写入每个数据块:
with open("image.zip", "wb") as f:
for i in range(threads):
for chunk in content[i]:
f.write(bytes(chunk))
这里唯一的内存开销是每个单独块的副本。
背景有点复杂。所以我们有一个(出于测试目的,在生产中可能更大)1.2GB .zip 文件,我们将其分成块并通过多个 Onionshare 实例发送。一旦接收方收到所有块,它会将它们放入一个列表中,称为内容。由于每个块都是一个整数列表(不知道为什么 onionshare 以整数而不是字节传输),内容是一个整数列表的列表。但是,为了正确保存它,我们需要(据我所知)将其转换为字节列表并使用 b''.join
保存。这是我们的代码:
#Write total content to image.zip
#content is a list of lists of int, but saved value must be a simple list of bytes
#This is what I came up with to convert it to a list of bytes
content2 = []
for i in range (0, threads):
for j in range(0, len(content[i])):
content2.append(bytes(content[i][j]))
#And now it can be saved with a join
open("image.zip", "wb").write(b''.join(content2))
我很确定这应该有效,但是这样做我们 运行 遇到了一个问题,即由于使用太多内存而导致进程被终止。 我们尝试增量写入文件而不是一次全部写入,但出现了同样的问题。所以我认为内存问题是在实际转换过程中发生的。 任何人都可以建议更好的方法吗?
谢谢
您不需要一次转换整个数据集。只需单独转换和写入每个数据块:
with open("image.zip", "wb") as f:
for i in range(threads):
for chunk in content[i]:
f.write(bytes(chunk))
这里唯一的内存开销是每个单独块的副本。