您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

认情况下,标准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文件时,无论如何都会缓存磁盘缓存。

python 2022/1/1 18:45:24 有326人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶