python多线程分块读取文件


Posted in Python onAugust 29, 2019

本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下

# _*_coding:utf-8_*_
import time, threading, ConfigParser
 
'''
Reader类,继承threading.Thread
@__init__方法初始化
@run方法实现了读文件的操作
'''
class Reader(threading.Thread):
  def __init__(self, file_name, start_pos, end_pos):
    super(Reader, self).__init__()
    self.file_name = file_name
    self.start_pos = start_pos
    self.end_pos = end_pos
 
  def run(self):
    fd = open(self.file_name, 'r')
    '''
    该if块主要判断分块后的文件块的首位置是不是行首,
    是行首的话,不做处理
    否则,将文件块的首位置定位到下一行的行首
    '''
    if self.start_pos != 0:
      fd.seek(self.start_pos-1)
      if fd.read(1) != '\n':
        line = fd.readline()
        self.start_pos = fd.tell()
    fd.seek(self.start_pos)
    '''
    对该文件块进行处理
    '''
    while (self.start_pos <= self.end_pos):
      line = fd.readline()
      '''
      do somthing
      '''
      self.start_pos = fd.tell()
 
'''
对文件进行分块,文件块的数量和线程数量一致
'''
class Partition(object):
  def __init__(self, file_name, thread_num):
    self.file_name = file_name
    self.block_num = thread_num
 
  def part(self):
    fd = open(self.file_name, 'r')
    fd.seek(0, 2)
    pos_list = []
    file_size = fd.tell()
    block_size = file_size/self.block_num
    start_pos = 0
    for i in range(self.block_num):
      if i == self.block_num-1:
        end_pos = file_size-1
        pos_list.append((start_pos, end_pos))
        break
      end_pos = start_pos+block_size-1
      if end_pos >= file_size:
        end_pos = file_size-1
      if start_pos >= file_size:
        break
      pos_list.append((start_pos, end_pos))
      start_pos = end_pos+1
    fd.close()
    return pos_list
 
if __name__ == '__main__':
  '''
  读取配置文件
  '''
  config = ConfigParser.ConfigParser()
  config.readfp(open('conf.ini'))
  #文件名
  file_name = config.get('info', 'fileName')
  #线程数量
  thread_num = int(config.get('info', 'threadNum'))
  #起始时间
  start_time = time.clock()
  p = Partition(file_name, thread_num)
  t = []
  pos = p.part()
  #生成线程
  for i in range(thread_num):
    t.append(Reader(file_name, *pos[i]))
  #开启线程
  for i in range(thread_num):
    t[i].start()
  for i in range(thread_num):
    t[i].join()
  #结束时间
  end_time = time.clock()
  print "Cost time is %f" % (end_time - start_time)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python采用raw_input读取输入值的方法
Aug 18 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
python冒泡排序简单实现方法
Jul 09 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python pycurl验证basic和digest认证的方法
May 02 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
pytorch实现MNIST手写体识别
Feb 14 Python
Python操作Excel把数据分给sheet
May 20 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
用sqlalchemy构建Django连接池的实例
Aug 29 #Python
详解Python 字符串相似性的几种度量方法
Aug 29 #Python
python多线程同步之文件读写控制
Feb 25 #Python
python线程中的同步问题及解决方法
Aug 29 #Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 #Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 #Python
深入了解python中元类的相关知识
Aug 29 #Python
You might like
php 数组使用详解 推荐
2011/06/02 PHP
浅析PHP Socket技术
2013/08/02 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
javascript天然的迭代器
2010/10/29 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Python饼状图的绘制实例
2019/01/15 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
Python Http请求json解析库用法解析
2020/11/28 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
校园创业策划书
2014/01/14 职场文书
医学类个人求职信范文
2014/02/05 职场文书
美容院营销方案
2014/03/05 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
大学生党员承诺书
2014/05/20 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
教您怎么制定西餐厅运营方案 ?
2019/07/05 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
Vue如何清空对象
2022/03/03 Vue.js