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

Python:最快的处理大文件的方式

5b51 2022/1/14 8:22:18 python 字数 4407 阅读 532 来源 www.jb51.cc/python

我有多个3GB制表符分隔文件.每个文件中有2000万行.所有的行必须被独立处理,任何两行之间没有关系. 我的问题是,什么会更快 with open() as infile: for line in infile: 或者B.将文件读入内存并处理它,一次250 MB? 处理不是很复杂,我只是在列1中将值列入List1,列2到List2等.可能需要一起添加一些列值. 我在一个具有

概述

with open() as infile: 
           for line in infile:

或者B.将文件读入内存并处理它,一次250 MB?

处理不是很复杂,我只是在列1中将值列入List1,列2到List2等.可能需要一起添加一些列值.

我在一个具有30GB内存的linux盒子上使用python 2.7. ASCII文本.

任何一种平行加速的方法?现在我正在使用前一种方法,而且这个过程很慢.正在使用任何CSVReader模块来帮助?
我不需要在python,任何其他语言或数据库使用的想法是欢迎的.
谢谢.

`

而且,使用CSV读取模块(不管是stdlib的csv还是像NumPy或Pandas这样的东西)可能是简单的一个好主意,它不太可能在性能上有很大的不同.

不过,值得检查的是,您真的是I / O绑定,而不是猜测.运行程序,看看您的cpu使用率是否接近0%或接近100%或核心.做什么阿马丹建议在评论,并运行您的程序,只需通过处理,看看是否削减了5%的时间或70%.你甚至可以尝试与os.open和os.read(1024 * 1024)的循环进行比较,或者看看是否更快.

由于您使用Python 2.x,Python依赖于C stdio库来猜测一次缓冲区的数量,因此可能值得强制缓冲.最简单的方法是为一些较大的bufsize使用readlines(bufsize). (您可以尝试不同的数字并测量它们,以查看峰值的位置.根据我的经验,通常来自64K-8MB的内容大致相同,但是根据您的系统可能会有所不同,尤其是在您的阅读时关闭一个网络文件系统,具有极佳的吞吐量,但可怕的延迟会影响实际物理驱动器的吞吐量 – 延迟时间以及操作系统的缓存.)

所以,例如:

bufsize = 65536
with open(path) as infile: 
    while True:
        lines = infile.readlines(bufsize)
        if not lines:
            break
        for line in lines:
            process(line)

同时,假设您使用的是64位系统,您可能希望尝试使用mmap而不是首先读取该文件.这当然不能保证更好,但它可能会更好,这取决于你的系统.例如:

with open(path) as infile:
    m = mmap.mmap(infile,access=mmap.ACCESS_READ)

Python mmap是一种奇怪的对象,它像str一样像文件一样,所以你可以手动迭代扫描换行符,或者你可以像read文件一样调用readline.这两个都将从Python中处理更多的处理,而不是将文件作为行或批处理readline进行处理(因为C中的循环现在处于纯Python中),尽管也许您可以使用re或简单的Cython扩展?)…但是操作系统的I / O优势知道你在做什么与映射可能会吞噬cpu的劣势.

不幸的是,Python并没有公开你要用来调整事情的madvise调用,试图在C中优化这个调用(例如,明确设置MADV_SEQUENTIAL而不是使内核猜测,或者强制透明的大页面) – 但是实际上ctypes从libc的功能.

总结

以上是编程之家为你收集整理的Python:最快的处理大文件的方式全部内容,希望文章能够帮你解决Python:最快的处理大文件的方式所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶