【发布时间】:2018-06-25 14:44:52
【问题描述】:
我正在解析一些 XML 并将数据写入不同的文件,具体取决于当前正在处理的 XML 元素。处理一个元素真的很快,写入数据也是。因此,文件需要经常打开和关闭。例如,给定一个巨大的file:
for _, node in lxml.etree.iterparse(file):
with open(f"{node.tag}.txt", 'a') as fout:
fout.write(node.attrib['someattr']+'\n'])
这可行,但相对而言,打开和关闭文件会花费很多时间。 (注意:这是一个玩具程序。实际上我写入文件的实际内容以及文件名是不同的。有关数据详细信息,请参见最后一段。)
另一种可能是:
fhs = {}
for _, node in lxml.etree.iterparse(file):
if node.tag not in fhs:
fhs[node.tag] = open(f"{node.tag}.txt", 'w')
fhs[node.tag].write(node.attrib['someattr']+'\n'])
for _, fh in fhs.items(): fh.close()
这将使文件保持打开状态,直到 XML 解析完成。有一些查找开销,但与迭代打开和关闭文件相比,这应该是最小的。
我的问题是,这种方法的缺点是什么?我知道这会使其他进程无法访问打开的文件,并且您可能会遇到a limit of open files。但是,我对性能问题更感兴趣。保持所有文件句柄打开是否会产生某种内存问题或处理问题?在这种情况下可能会发生过多的文件缓冲?我不确定,所以这个问题。
输入的 XML 文件最大可达 70GB 左右。生成的文件数量限制在 35 个左右,这与我在上述帖子中读到的限制相去甚远。
【问题讨论】:
-
你能定义:huge 并估计 # 个输出文件吗?
-
从广义上讲,避免进行 OS 系统调用将加快您的代码的速度——换句话说,不打开和关闭文件会更快反复。这是否重要取决于您到底在做什么。每个打开的文件都需要一些内存,因此如果同时打开大量文件,这可能会成为一个问题(但这是值得怀疑的,IMO)。
-
@hootnot 我添加了一段提供更多数据信息的段落。
-
@martineau 请看我的编辑。
-
Bram:在这种情况下,我听上去不会担心通过同时打开/同时打开它们会占用太多内存。
标签: python python-3.x performance file-handling