我的问题是,什么会更快
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的功能.