<p>默认情况下,标准<a href="http://docs.python.org/2/library/functions.html#open">^{<cd1>} function</a>已经返回缓冲文件(如果您的平台上有)。对于通常<em>完全缓冲的文件对象。</p>
<p><em>通常这里的</em>意味着Python将此留给C stdlib实现;它在Windows上使用<a href="http://linux.die.net/man/3/fopen">^{<cd2>} call</a>(<code>wfopen()</code>来支持UTF-16文件名),这意味着选择了文件的默认缓冲区;在Linux上,我相信这将是8kb。对于像XML这样的纯读取操作,解析这种类型的缓冲是您所需要的。</p>
<p>由<code>iterparse</code>完成的XML解析以16384字节(16kb)的块读取文件。</p>
<p>如果要控制缓冲区大小,请使用<code>buffering</code>关键字参数:</p>
<pre><code>open('foo.xml', buffering=(2<<16) + 8) # buffer enough for 8 full parser reads
</code></pre>
<p>它将覆盖默认缓冲区大小(我希望它与文件块大小或其倍数匹配)。根据<a href="http://seann.herdejurgen.com/resume/samag.com/html/v11/i04/a6.htm">this article</a>的说法,增加读缓冲区<em>应该有帮助,并且使用至少是预期读块大小的4倍加上8字节的大小将提高读性能。在上面的示例中,我将其设置为ElementTree读取大小的8倍。</p>
<p><a href="http://docs.python.org/2/library/io.html#io.open">^{<cd6>} function</a>表示对象的新的Python 3 I/O结构,在这里,I/O被拆分为新的类类型层次结构,以提供更大的灵活性。代价是更多的间接性,更多的数据必须经过的层,Python C代码本身做更多的工作,而不是把这些留给OS。</p>
<p>你可以试着看看<code>io.open('foo.xml', 'rb', buffering=2<<16)</code>是否会有更好的表现。以<code>rb</code>模式打开将为您提供<a href="http://docs.python.org/2/library/io.html#io.BufferedReader">^{<cd9>} instance</a>。</p>
<p>您确实不想使用<code>io.TextIOWrapper</code>;底层expat解析器需要原始数据,因为它将对XML文件编码本身进行解码。它只会增加额外的开销;如果改为在<code>r</code>(textmode)中打开,则会得到这种类型。</p>
<p>使用<code>io.open()</code>可能会给您更大的灵活性和更丰富的API,但是底层的C文件对象是使用<code>open()</code>而不是<code>fopen()</code>打开的,所有缓冲都由Python <code>io.BufferedIOBase</code>实现处理。</p>
<p>你的问题是处理这个野兽,而不是文件读取,我想。当读取一个800GB的文件时,磁盘缓存几乎是快照。</p>