微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以内存高效的方式在python中更快地编写大文件

如何解决以内存高效的方式在python中更快地编写大文件

我正在尝试使用相同的文本创建一个文件,但我的系统在一段时间后执行脚本后挂起。

the_text = "This is the text I want to copy 100's of time"
count = 0
while True:
    the_text += the_text
    count += 1
    if count > (int)1e10:
        break

注意:以上是我的代码的过度简化版本。我想多次创建一个包含相同文本的文件文件大小约为 27GB
我知道这是因为 RAM 过载了。这就是我想知道如何在 python 中以快速有效的方式做到这一点。

解决方法

不要在内存中累积字符串,而是将它们直接写入文件:

the_text = "This is the text I want to copy 100's of time"
with open( "largefile.txt","wt" ) as output_file
for n in range(10000000):
    output_file.write(the_text)

在我的笔记本电脑上使用 SSD 创建一个大约 440MiB 的文件需要大约 14 秒的时间。

上面的代码一次写入一个字符串 - 我确信可以通过将这些行批处理在一起来加快速度,但是如果没有关于您的应用程序可以做什么的任何信息,那么推测这一点似乎没有多大意义。>

最终这将受到磁盘速度的限制;如果您的磁盘可以管理 50MiB/s 的持续写入,那么写入 450MiB 将需要大约 9 秒 - 这听起来就像我的笔记本电脑正在逐行写入

如果我一次写入 100 个字符串 write(the_text*100) /100 次,即 range(100000),这需要约 6 秒,加速 2.5 倍,写入速度约 70MiB/s

如果我使用 range(10000) 一次写入 1000 个字符串,这需要大约 4 秒 - 我的笔记本电脑开始以大约 100MiB/s 的速度达到顶峰。

我使用 write(the_text*100000) 获得了大约 125MiB/s。

进一步增加到 write(the_text*1000000) 会减慢速度,大概是字符串的 Python 内存处理开始需要相当长的时间。

进行文本输入/输出会稍微减慢速度 - 我知道使用 Python 我可以对二进制文件进行大约 300MiB/s 的组合读写。

总结:对于 27GiB 文件,我的笔记本电脑在 Windows 10 上运行 Python 3.9.5 的最大速度约为 125MiB/s 或 8s/GiB,因此在以大约 4.5 的块写入字符串时,创建文件需要大约 202 秒MiB(45 个字符*100,000)。赞一个

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。