Python:最快的处理大文件的方式
我有多个3GB制表符分隔文件.每个文件中有2000万行.所有的行必须被独立处理,任何两行之间没有关系.
我的问题是,什么会更快 with open() as infile: for line in infile: 或者B.将文件读入内存并处理它,一次250 MB? 处理不是很复杂,我只是在列1中将值列入List1,列2到List2等.可能需要一起添加一些列值. 我在一个具有30GB内存的linux盒子上使用python 2.7. ASCII文本. 任何一种平行加速的方法?现在我正在使用前一种方法,而且这个过程很慢.正在使用任何CSVReader模块来帮助? ` 解决方法
听起来你的代码是I / O绑定的.这意味着多处理不会有帮助 – 如果您花费90%的时间从磁盘读取数据,另外7个进程等待下一次读取不会有任何帮助.
而且,使用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位系统,您可能希望尝试使用 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并没有公开你要用来调整事情的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |