python 处理大数据程序运行的越来越慢的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 处理大数据程序运行的越来越慢的问题相关的知识,希望对你有一定的参考价值。

参考技术A 最近编写并运行了一个处理1500万个数据的程序,本来最初每秒可以处理150个左右的数据,预计大概15个小时的时间就可以处理完,晚上的时候就开始运行,本以为等到第二天中午就可以得到结果呢,,,

可是,等我第二天的时候一看,什么???还没处理完,当前的数据处理速度变成了一秒5个左右,然后还需要等待300个小时。

然后就查了一下这个问题,原来同样也有很多人在处理大数据的时候遇到了这个问题,大多数的文章分析的原因都是说由于GC(垃圾回收)造成的性能下降。
Python的垃圾回收机制的工作原理为每个对象维护一个引用计数,每次内存对象的创建与销毁都必须修改引用计数,从而在大量的对象创建时,需要大量的执行修改引用计数操作,对于程序执行过程中,额外的性能开销是令人可怕的。回收的触发时机有两种可能,一是用户主动调用gc.collect(),二是对象数量超过阈值。

所以正是GC拖慢了程序的性能,所以我们可以考虑在处理的时候禁止垃圾回收。

通过这样的改进之后速度确度会有很大的提升。但是又有也会另外的一个问题,内存溢出,由于运行的过程中生成大量的对象,一次使用后就没有了引用,由于关闭了垃圾回收机制,一直存在内存中得不到清理,然后程序的内存使用量越来越大。解决的方法就是定期打开gc.enable()再关闭或者主动调用gc.collect(),这样就可以了。

通过上述的改进后程序确实了很多,可是我的程序还是运行的越来越慢,我都怀疑人生了,然后分别测试了各个步骤所花费的时间才知道了原因,我使用了pandas创建一个DataFrame,然后每次迭代得到的结果都添加新的数据到DataFrame中,随着里边的数据越来越多,添加的速度也就越来越慢了,严重的拖累的运行速度。这里的解决方法有两个:

1 分段保存结果,间隔一段时间就保存一次结果,最后再将多次的结果合并。

2 换一个数据存储方法,我是直接使用了python的字典进行保存结果,它随着数据的增多添加的速度也会变慢,但是差别不是很大,在可接受的范围内,可以使用;或者再加上方法1,分段进行保存再合并也是可以的。

以上是关于python 处理大数据程序运行的越来越慢的问题的主要内容,如果未能解决你的问题,请参考以下文章

中枪了?六种让你的 Python 程序变慢的坏习惯

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

mongodb日志过大问题处理

如何解决BI系统性能差响应慢的问题

python已协程方式处理任务

在集成 Python 的多处理中使用 Pool.map 时,程序运行速度越来越慢