当前位置: 首页 > 面试题库 >

在Python 2.7中高效读取800 GB XML文件

逄俊力
2023-03-14
问题内容

我正在python 2.7中读取800 GB的xml文件,并使用etree迭代解析器对其进行解析。

目前,我只使用open('foo.txt')没有缓冲参数。我是应该采用这种方法还是应该使用缓冲参数,还是应该使用io.BufferedReader或io.open或io.TextIOBase之类的方法,对此感到有些困惑。

朝正确方向的观点将不胜感激。


问题答案:

默认情况下,标准open()函数已经返回一个缓冲文件(如果在您的平台上可用)。对于
通常 完全缓冲的文件对象。

通常, 这里意味着Python将其留给C
stdlib实现;它使用fopen()调用(wfopen()在Windows上支持UTF-16文件名),这意味着已选择文件的默认缓冲;在Linux上,我相信是8kb。对于像XML解析这样的纯读取操作,这种类型的缓冲
正是 您想要的。

通过XML解析完成iterparse的文件以16384字节(16kb)的块读取。

如果要控制缓冲区大小,请使用buffering关键字参数:

open('foo.xml', buffering=(2<<16) + 8)  # buffer enough for 8 full parser reads

它将覆盖默认的缓冲区大小(我希望与文件块大小或其倍数匹配)。根据这篇文章,增加读取缓冲区
应该会 有所帮助,并且使用至少预期读取块大小的4倍加上8个字节的大小将提高读取性能。在上面的示例中,我将其设置为ElementTree读取大小的8倍。

io.open()函数表示对象的新Python
3 I / O结构,其中I / O被拆分为新的类类型层次结构,从而为您提供了更大的灵活性。价格更加间接,要传递的数据层更多,并且Python
C代码本身会执行更多工作,而不是将这些工作留给操作系统。

可以 尝试看看效果是否io.open('foo.xml', 'rb', buffering=2<<16)会更好。在rb模式下打开将为您提供io.BufferedReader实例。

希望使用io.TextIOWrapper;
底层的expat解析器需要原始数据,因为它将解码XML文件本身的编码。这只会增加额外的开销;如果r改为以(文本模式)打开,则会得到此类型。

使用io.open()可能会为您提供更大的灵活性和更丰富的API,但是使用open()而不是可以打开基础C文件对象fopen(),并且所有缓冲都由Pythonio.BufferedIOBase实现处理。

我认为您的问题将是处理这头野兽,而不是读取文件。读取800GB文件时,无论如何都会缓存磁盘缓存。



 类似资料:
  • 我的代码目录中有一个名为.env的文件.env有不同的配置 在我的代码目录中,我有一个名为脚本的文件夹 在脚本中,我有一个名为“control.py”的脚本,需要从.env读取配置 我如何才能做到这一点? 结构如下 。env有所有的配置文件,control.py需要读取这些配置文件。

  • 问题内容: 下面的Go代码读取10,000条记录的CSV(时间戳和浮点数),对数据进行一些操作,然后将原始值以及的附加列写入到另一个CSV中。但是,它的运行速度非常慢(例如,数小时,但大部分时间是),我很好奇我可以处理的CSV读取/写入是否效率低下。 我正在寻求帮助,以使此CSV读/写模板代码尽快。对于此问题的范围,我们不必担心该方法。 问题答案: 您先将文件加载到内存中,然后再对其进行处理,这对

  • 我在读取压缩的csv文件时出错。错误如下:“zlib.error:解压缩时错误-3:设置的距离无效” 代码: 我在文件上尝试了Gunzip,它没有任何问题。我使用Gunzip-t。它给rc 0。

  • 问题内容: 我有一个非常大的文本文件(45GB)。文本文件的每一行包含两个空格分隔的64位无符号整数,如下所示。 4624996948753406865 10214715013130414417 4305027007407867230 4569406367070518418 10817905656952544704 3697712211731468838 … … 我想读取文件并对数字进行一些操作。

  • 问题内容: 我正在尝试读取资源(asdf.txt),但是如果文件大于5000字节,例如,在content变量的末尾插入了4700个空字符。有什么办法可以删除它们?(或设置缓冲区的正确大小?) 这是代码: 问题答案: 最简单的方法是做正确的事情:使用阅读器读取文本数据: 并非 一定 要定义要读取的文本文件的编码。在上面的示例中,它将是THE_ENCODING。 请注意,您的代码和本示例代码在Java

  • 问题内容: 是否可以用Python读取二进制MATLAB .mat文件? 我已经看到SciPy声称支持读取.mat文件,但是我没有成功。我安装了SciPy 0.7.0版,但找不到该方法。 问题答案: 需要导入,…