python处理大文件_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的功能.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值