【发布时间】:2014-03-07 23:27:00
【问题描述】:
我特别需要使用with open 语句来打开文件,因为我需要同时打开几百个文件并使用K-way merge 将它们合并。我理解,理想情况下我应该将 K 保持在较低水平,但我没有预见到这个问题。
现在不能从头开始,因为我有一个截止日期。所以在这一点上,我需要非常快速的 I/O,它不会将文件的整个/巨大部分存储在内存中(因为有数百个文件,每个 ~10MB)。我只需要一次读取一行即可进行 K 路合并。减少内存使用是我现在的主要关注点。
我了解到with open 是最有效的技术,但我无法理解如何将open 的所有文件放在一个with open 语句中。原谅我的初学者无知!
更新:此问题已解决。事实证明,问题根本不在于我是如何打开文件的。我发现过多的内存使用是由于垃圾收集效率低下造成的。我根本没有使用with open。我使用了常规的f=open() 和f.close()。垃圾收集拯救了这一天。
【问题讨论】:
-
我不认为
with open比f = open() ... close(f)更有效。它应该更方便,但听起来您的情况并非如此。您可以只打开一堆文件并将文件对象保存在一个列表中。 -
with语句与效率无关,它只是确保文件将被隐式关闭(即使发生异常)。正如@MarkkuK 所说,您可以将文件对象的引用存储在列表中,然后在最后手动关闭它们,并使用 try-finally 块来确保即使发生错误也关闭文件。 -
感谢两位的快速响应。您能否建议一个替代方案,即使我一起打开几百个文件,内存使用量也不会那么高?由于我一次只需要从这些文件中提取一行,我认为如果我使用一些不会在缓冲区中加载大部分文件的技术会有所帮助。
-
因此,您想先从第一个文件中读取所有行,然后再从第二行...等等,或者您想从每个文件中读取第一行,然后从每个文件中读取第二行...。 ?
-
使用文件对象的
readline-方法读取单行。重复使用将每次检索下一行:f = open(file); f.readline(); f.readline(); ...; f.close()
标签: python file python-2.7 merge with-statement