加快写入文件的速度

2024-10-01 00:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经分析了一些用cProfile继承的遗留代码。我已经做了一些有帮助的修改(比如使用simplejson的C扩展!)。

基本上,这个脚本是将数据从一个系统导出到一个ASCII固定宽度文件。每一行是一条记录,它有许多值。每行7158个字符,包含大量空格。记录总数为150万条。每行一次生成一行,需要一段时间(每秒5-10行)。

生成每一行时,它会尽可能简单地写入磁盘。分析表明,总时间的约19-20%用于file.write()。一个1500行的测试用例需要20秒。我想减少这个数字。

现在看来,下一个胜利将是减少写入磁盘的时间。如果可能的话,我想减少。我可以在内存中保存一个记录缓存,但我不能等到结束时立即将其全部转储。

fd = open(data_file, 'w')
for c, (recordid, values) in enumerate(generatevalues()):
        row = prep_row(recordid, values)
        fd.write(row)
        if c % 117 == 0:
                if limit > 0 and c >= limit:
                        break
                sys.stdout.write('\r%s @ %s' % (str(c + 1).rjust(7), datetime.now()))
                sys.stdout.flush()

我的第一个想法是在一个列表中保存一个记录缓存,并成批地写出来。会更快吗?类似于:

rows = []
for c, (recordid, values) in enumerate(generatevalues()):
        rows.append(prep_row(recordid, values))
        if c % 117 == 0:
            fd.write('\n'.join(rows))
            rows = []

我的第二个想法是用另一根线,但那让我想死在里面。


Tags: inforif记录时间磁盘filewrite
3条回答

实际上,你的问题并不是file.write()占用你20%的时间。你80%的时间不在这里!

写入磁盘的速度很慢。你真的无能为力。把东西写到磁盘上只需要很长时间。你几乎没办法加快速度。

你想要的是让I/O时间成为程序的最大部分,这样你的速度就被硬盘的速度而不是你的处理时间所限制。理想情况是file.write()100%使用!

您可以在python中执行mmap,这可能会有帮助。但我怀疑您在分析时犯了一些错误,因为20秒内7k*1500大约是0.5兆字节/秒。做一个测试,您可以用相同的长度编写随机行,您会发现它比这快得多。

将写操作成批地分成500个组确实大大加快了写操作的速度。对于这个测试用例,写入行在I/O中分别花费了21.051秒,而成批写入117行则花费了5.685秒来写入相同数量的行。500批总共只花了0.266秒。

相关问题 更多 >