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

前端之家收集整理的这篇文章主要介绍了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模块来帮助?
我不需要在python,任何其他语言或数据库使用的想法是欢迎的.
谢谢.

`

解决方法

听起来你的代码是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位系统,您可能希望尝试使用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相关文章