背景有点复杂。因此,我们有一个1.2GB .zip文件(出于测试目的,可能在生产中可能更大),我们将其拆分为多个块,并通过多个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))
这里唯一的内存开销是每个单独块的副本。
您无需先加入列表即可写入文件。只需循环浏览每个列表,然后一次将数据写入文件一个块即可。