我正在写一个程序,需要在Python中向文件中写入大量重复的字节。
为了简化问题,我将使用数据的表示。buffer
总是open(file_name, "a+")
的返回结果,b"0"
将是“重复数据”的任意表示。
假设我想写重复的数据50,000次,到目前为止,我想到了三种方法。
第一种方法是先在内存中生成数据,然后写入(这会占用大量内存)
data = b"0" * 50_000
buffer.write(data)
字符串
第二种方法是将每次迭代写在一个循环中(这是极其缓慢的)
for _ in range(50_000):
buffer.write(b"0")
型
最后,第三种方法是合并结合两者,并写入更大的段(这比第二种方法快得多,但比第一种方法慢,最重要的是,即使在使用中也会使用内存,加上总体上这种设计非常丑陋)
data_x1 = b"0"
data_x10 = b"0" * 10
data_x100 = b"0" * 100
data_x1000 = b"0" * 1000
# writing in a loop using bigger to smaller segments
# until there is no more to write
num_left = 50_000
while num_left > 0:
if num_left >= 1000:
buffer.write(data_x1000)
num_left -= 1000
elif num_left >= 100:
buffer.write(data_x100)
num_left -= 100
elif num_left >= 10:
buffer.write(data_x10)
num_left -= 10
else:
buffer.write(data_x1)
num_left -= 1
型
TLDR:目标是在不使用Python循环的情况下重复地将指定的字节集写入文件,也不首先在内存中生成整个序列。
我一直在研究BufferedWriter
的write方法,注意到它需要一个类似字节的对象。如果可能的话,最佳的方法是创建一个“类似字节”的对象,模拟一个重复的数据流,可以在不使用Python循环的情况下由缓冲区写入x次。
2条答案
按热度按时间ubbxdtey1#
只需合理地创建最大的数据块,并将最后一次写入的数据切片得更小
字符串
请注意,当打开
"a"
时,.tell()
将从0
开始,并且与初始文件结尾有 * 偏移量 *。然而,如果您想在同一个文件中读取其他内容或获取总文件大小,您可能会发现将"r+"
和.seek()
打开到结尾更好。bis0qfac2#
如果你打算尝试使用大缓冲区写,你可能最好使用系统默认的缓冲区大小。
字符串
您可能会通过使用默认缓冲区大小的倍数来获得一点好处,但是一定要在
open
命令中使用这个值。型
用户@trapdrap(见评论)声称,在所有情况下,你都应该使用
buffering = 0
,因为你不想或不需要缓冲。