想象一下以下简单的脚本:
def reader():
for line in open('logfile.log'):
# do some stuff here like splitting the line or filtering etc.
yield some_new_line
def writer(stream):
with gzip.GzipFile('some_output_file.gz', 'w') as fh:
for _s in stream:
fh.write(_s+'\n')
stream = reader()
writer(stream)
非常简单 - 使用生成器读取行并将一些结果写入gzip文件。
但如何加快速度呢?硬盘驱动器似乎是一个瓶颈。我看到我可以使用缓冲区大小进行读取 - 使用 open(文件,模式,缓冲区)语法。但是我不太确定它能否适用于我的情况(使用发电机)。
此外,我没有找到gzip.GzipFile调用的任何缓冲区参数。从代码中,它基于一些缓冲类,但我没有看到任何进一步的文档。
我有一个(疯狂的?)想法来创建一个显式缓存并用它替换open方法 - 所以它将以更大的块读取文件,比如8MB,然后按行分割它。至于写入,我想创建一个要写入的行列表,收集它们(比如5000行),然后转储到文件中。
我是否想重新发明轮子?我对脚本目前的性能不满意,所以我试图尽可能加快它的速度。
UPD。我有大约4-5个不同的并行工作者在运行。它们都执行读写操作。所以我猜硬盘驱动器从一个扇区跳到另一个扇区,这就是为什么我想实现一些缓冲区来定期以大块方式转储数据的原因。
谢谢!
答案 0 :(得分:0)
我可以提出更紧凑的代码:
def reader():
for line in open('logfile.log'):
# do some stuff here like splitting the line or filtering etc.
yield some_new_line
def writer(stream):
with gzip.GzipFile('some_output_file.gz', 'w') as fh:
fh.writelines(stream)
writer(reader())
然而,没有实际的加速。 Python将管理流,但如果你不能为完整文件写入而节省内存,那么加速就不会很好。
通过gzip压缩是最慢的一步。以下功能只能加速~3%(忽略发电机部件)。
def writer():
f = open('logfile.log').read()
gzip.GzipFile('some_output_file.gz', 'w').write(f)
writer()
所以,如果你需要gzip,那么你做不了多少。