Python多线程

2017/12/16
这篇文章主要针对前几天Mongo数据库进行操作时的一些内容进行记录。


首先声明,单线程将所有文件内容读取到内存中,200M的文件只需要30S,所以所有慢的过程都是由于后面进程层面的一些内容产生的,而与读取文件无关,即使是边读取边操作。


再次声明的是,这部分的操作内容,对于计算内容应该算是不多的,这部分主要吃socket那部分的内容。
目的是,将文本中的记录插入到数据库中,一行对应于一条记录。
尝试过的集中方法是
1、多线程式,创建一个队列,主线程进行读取文件输出到队列中,其他线程从队列中消费。使用方式是单个update的方式。
2、多进程式,
1)使用队列,在多个进程中进行消息传递,但是效果一般,也是使用单个update的方式,我猜主要也是卡在了插入的网络通信中。
2)使用队列,多进程下,每个进程再开辟多个线程。这个也是不好使,这个应该是因为队列的抢占上消耗了太多时间。另外也试过为每一个进程在开一个队列。也是好使。


目前最好使得,插入效果最好的,可能还不算非常好。
就是将插入的内容分发到各个进程,每个进程只负责自己的那一部分,这样能稍微快了一点,
最后再次进行优化,就是使用了mongo的bulkwrite方法。
这个甚至能达到了每秒2W的插入量。
当然后续的过程也逐渐降低,我觉得应该是因为,后续的操作太多是要调整原有的文件记录位置导致变慢了。
这个问题可以解决,就是先将文件进行排序,因为本身文件中的记录不是串行的往后进行添加,而是可能会插入到原来的位置,这样就导致了文件的位置上有些不适应。你懂的,那个意思。就跟原来学习文件系统的时候,那种索引碎片?的概念差不多。
而且这样速度太快了之后,也会报错,应该是插入的太多了。
而且,现在没有对报错进行过相应的处理,导致分给这个进程的数据就丢了。


我觉得,通过这几次的事件,也渐渐对多线程多进程有了些了解,一定要分清,这部分的操作到底是IO密集型,还是计算密集型。

这个问题搞清了,再进行相应部分的选择,然后达到一个速度上的提升。

 
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值