【问题标题】:Writing a big file in python faster in memory efficient way以内存有效的方式在python中更快地编写一个大文件
【发布时间】:2021-07-05 23:28:56
【问题描述】:

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

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 中快速有效地做到这一点。

【问题讨论】:

  • 内存不足不足为奇;所以不要在内存中累积大量字符串 - 即将字符串(行)写入文件并且不要继续将它们添加到内存中的累积字符串中
  • 也可以分块写入,比如一次 512 行。您可以将字符串加倍以构建要写入的字符串。
  • 写“一个字符串”*10000,应该会更好。例如:>>> "test\n"*10 'test\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\ntest\n'

标签: python memory-management


【解决方案1】:

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

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 的笔记本电脑上花费了大约 14 秒来创建一个大约 440MiB 的文件。

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

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

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

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

write(the_text*100000) 获得 ~125MiB/s。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 2014-03-28
    • 2017-01-19
    • 2019-04-20
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多