python是否在内存中复制打开的文件?

时间:2014-04-14 09:32:49

标签: python memory

所以我想用os.walk()搜索文件名,并将结果列表名称写入文件。我想知道哪些更有效:打开文件,然后在找到它们时写出每个结果,或者将所有内容存储在列表中,然后编写整个列表。那个列表可能很大,所以我想知道第二个解决方案是否有用。

1 个答案:

答案 0 :(得分:2)

见这个例子:

import os
fil = open('/tmp/stuff', 'w')
fil.write('aaa')
os.system('cat /tmp/stuff')

你可能希望看到aaa,但你什么也得不到。这是因为Python有一个内部缓冲区。写入磁盘是昂贵的,因为它必须:

  • 告诉操作系统编写它。
  • 实际上将数据传输到磁盘(在硬盘上可能涉及将其旋转,等待IO时间等)。
  • 等待操作系统报告成功。

如果你想写任何小东西,它可能会累积很长一段时间。相反,Python所做的是保持缓冲区,并且只有实际不时写入。您不必担心内存增长,因为它将保持在较低的值。来自docs

“0表示无缓冲,1表示行缓冲,任何其他正值表示使用(大约)该大小(以字节为单位)的缓冲区。负缓冲表示使用系统默认值,通常为tty设备进行行缓冲并完全缓冲其他文件。如果省略,则使用系统默认值。“

完成后,请确保在执行过程中的任何时候执行fil.close()fil.flush(),或使用关键字buffering=0禁用缓冲。

另一件需要考虑的事情是,如果由于某种原因,程序在流程中间退出,会发生什么。如果将所有内容存储在内存中,它将会丢失。你在磁盘上有什么,将保留在那里(但除非你冲洗,否则无法保证实际保存了多少)。