我有一段代码在每次迭代中生成相当大的列表。为了节省内存,我想在生成列表后的每次迭代中将每个列表写入一个二进制文件。 我已经用文本文件尝试过这个(甚至在 linux 中将参数设置为“wb”)。 “wb”似乎对以二进制或文本格式写入的文件没有任何影响。而且,写入的文件很大,我不想要这个。我确信如果我能以二进制格式编写这些列表,这个文件将会小得多。 谢谢
请您参考如下方法:
既然你提到了对可压缩性的需求,我建议使用 pickle与 gzip模块来压缩你的输出。您可以一次写入和读回您的列表,以下是如何操作的示例:
import gzip, pickle
output = gzip.open('pickled.gz', 'wb', compresslevel=9)
for x in range(10):
output.write(pickle.dumps(range(10)) + '\n\n')
output.close()
然后使用生成器一次生成一个列表:
def unpickler(input):
partial = []
for line in input:
partial.append(line)
if line == '\n':
obj = ''.join(partial)
partial = []
yield pickle.loads(obj)
input = gzip.open('pickled.gz', 'rb')
for l in unpickler(input):
print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
