1. import datetime
  2. import sys
  3. import oss2
  4. from itertools import islice
  5. import pandas as pd
  6. import re
  7. import json
  8. from pandas.tseries.offsets import Day
  9. from multiprocessing import Process, JoinableQueue, cpu_count, Manager
  10. import time
  11.  
  12. def mkbuck(bk):
  13. auth = oss2.Auth(username, password)
  14. bucket = oss2.Bucket(auth, address, bk)
  15. return bucket
  16.  
  17. #获取前天最后一小时的paths
  18. def getbflastpt(bucket, bfyespattern):
  19. bfpamax = []
  20. for bf in islice(oss2.ObjectIterator(bucket, prefix=bfyespattern), sys.maxsize):
  21. c = bf.key
  22. if c[-1:] != '/':
  23. bfpamax.append(int(c.split('/')[4]))
  24. last = pd.Series(bfpamax).unique().max()
  25. if last < 10:
  26. bflastpt = bfyespattern + '/0' + str(last)
  27. else:
  28. bflastpt = bfyespattern + '/' + str(last)
  29. return bflastpt
  30.  
  31. #获取当天第一个小时的paths
  32. def getnowfirstpt(bucket, nowpattern):
  33. bfpamin = []
  34. for bf in islice(oss2.ObjectIterator(bucket, prefix=nowpattern), sys.maxsize):
  35. c = bf.key
  36. if c[-1:] != '/':
  37. bfpamin.append(int(c.split('/')[4]))
  38. first = pd.Series(bfpamin).unique().min()
  39. if first < 10:
  40. nowfirstpt = nowpattern + '/0' + str(first)
  41. else:
  42. nowfirstpt = nowpattern + '/' + str(first)
  43. return nowfirstpt
  44.  
  45. #获取所有的昨日paths,并合并得到完全的paths和数量
  46. def getfullnum(bk, bfyespattern, nowpattern, yespattern):
  47. lists = []
  48. bucket = mkbuck(bk)
  49. bfyespattern = getbflastpt(bucket, bfyespattern)
  50. nowpattern = getnowfirstpt(bucket, nowpattern)
  51. timelist = (s for s in (bfyespattern, yespattern, nowpattern))
  52. for pter in timelist:
  53. for bf in islice(oss2.ObjectIterator(bucket, prefix=pter), sys.maxsize):
  54. c = bf.key
  55. lists.append(c)
  56. return lists, len(lists)
  57.  
  58. #以下为进程间通信,即生产者、消费者模型
  59. def getfull(bk, bfyespattern, nowpattern, yespattern, q):
  60. lists, num = getfullnum(bk, bfyespattern, nowpattern, yespattern)
  61. for c in lists:
  62. q.put(c)
  63. q.join()
  64.  
  65. def consumer(bk, q, d):
  66. bucket = mkbuck(bk)
  67. repattern2 = re.compile('{.*"adadji",.*}')
  68. while True:
  69. js = []
  70. ress = q.get()
  71. if ress[-1:] != '/':
  72. remote_data = bucket.get_object(ress).read().decode('utf-8')
  73. aa = (d for d in repattern2.findall(remote_data))
  74. for a in aa:
  75. temdic = json.loads(a)
  76. if (starttime <= temdic['created_at']) and (temdic['created_at'] <= endtime):
  77. js.append(temdic)
  78. df = pd.DataFrame(js, columns=['dd','cc'])
  79. d[ress] = df##d为通过主进程Manager共享变量将数据取出
  80. # print(ress)
  81. q.task_done()# q.join()发送一次信号,证明一个数据已经被取走了
  82.  
  83. if __name__ == '__main__':
  84. s1 = time.time()
  85. now_time = datetime.datetime.now() # 获取当前时间
  86. bfyes_time = (now_time - 2 * Day()).strftime('%Y/%m/%d')
  87. yes_time = (now_time - 1 * Day()).strftime('%Y/%m/%d')
  88. yesdate = (now_time - 1 * Day()).strftime('%Y-%m-%d')
  89. yesdate1 = (now_time - 1 * Day()).strftime('%Y%m%d')
  90. endtime = (now_time - 1 * Day()).strftime('%Y-%m-%d 23:59:59')
  91. starttime = (now_time - 1 * Day()).strftime('%Y-%m-%d 00:00:00')
  92. nowdate = now_time.strftime('%Y/%m/%d')
  93.  
  94. bk = 'xxx'
  95. bfyespattern = '%s/%s' % (bk, bfyes_time)
  96. yespattern = '%s/%s' % (bk, yes_time)
  97. nowpattern = '%s/%s' % (bk, nowdate)
  98.  
  99. q = JoinableQueue(cpu_count())
  100. m = Manager()
  101. d = m.dict() ##创建进程间的共享内存字典,方便各个进程处理好的数据
  102. p1 = Process(target=getfull, args=('xx', bfyespattern, nowpattern, yespattern, q))
  103. #####生成consumer多进程
  104. cc = []
  105. for c in range(cpu_count() - 1):
  106. c1 = Process(target=consumer, args=('xx', q, d))
  107. cc.append(c1)
  108.  
  109. p_l = [p1]
  110. for c in cc:
  111. c.daemon = True
  112. p_l.append(c)
  113.  
  114. for p in p_l:
  115. p.start()
  116. p1.join()
  117. d = d.values()
  118. df1 = pd.concat(d, ignore_index=True)
  119. df1.sort_values('created_at', inplace=True)
  120. print(time.time() - s1)
  121. print('=' * 20)
  122. print(df1)

  说明:需求为获取昨日的数据即可,因oss实时数据存储可能存在提前或延迟情况,因此读取前天的最后一小时,昨日全部,当天最开始一小时数据,读者可根据自身情况进行修改

以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据的更多相关文章

  1. Pandas之:Pandas高级教程以铁达尼号真实数据为例

    Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...

  2. zTree实现获取一级节点数据

    zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...

  3. request.getParameter()获取不到数据

    HTML中的form表单有一个关键属性 Content-Type=application/x-www-form-urlencoded 或multipart/form-data. 1. Content- ...

  4. python从数据库获取全量数据的方法

    python从数据库获取全量数据的方法 学习了:https://blog.csdn.net/lom9357bye/article/details/79503658 原文膜拜: import psyco ...

  5. request.getParameter()获取不到数据的问题

    最近做项目时,发现手机客户端通过http协议post方式上传数据到服务端,在服务器端通过request.getInputStream()能获取到相应的数据,但用request.getParameter ...

  6. Oracle根据符合条件的数据循环批量更新

    --批量对符合条件的表记录进行更新 --aa代表查询出的符合条件数据的别名 --aa后的表示需要符合的条件 --loop后开始写更新操作 begin for aa in (select a.objec ...

  7. 查询同一张表符合条件的某些数据的id拼接成一个字段返回

    同一张表存在类似多级菜单的上下级关系的数据,查询出符合条件的某些数据的id拼接成一个字段返回: SELECT CONCAT(a.pid, ',', b.subid) AS studentIDS FRO ...

  8. 深度学习实践-物体检测-faster-RCNN(原理和部分代码说明) 1.tf.image.resize_and_crop(根据比例取出特征层,进行维度变化) 2.tf.slice(数据切片) 3.x.argsort()(对数据进行排列,返回索引值) 4.np.empty(生成空矩阵) 5.np.meshgrid(生成二维数据) 6.np.where(符合条件的索引) 7.tf.gather取值

    1. tf.image.resize_and_crop(net, bbox, 256, [14, 14], name)  # 根据bbox的y1,x1,y2,x2获得net中的位置,将其转换为14*1 ...

  9. Shell 筛选符合条件的 ELF 文件

    0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机 ...

随机推荐

  1. 使用IDEA开发SPARK提交remote cluster执行

    开发环境 操作系统:windows 开发工具:IntelliJ IDEA  14.1.1 需要安装scala插件 编译环境:jdk 1.7   scala 2.10.4 使用IDEA开发spark应用 ...

  2. map集合的应用

    分析以下需求,并用代码实现: (1)利用键盘录入,输入一个字符串 (2)统计该字符串中各个字符的数量例如 用户输入字符串"If~you-want~to~change-your_fate_I_ ...

  3. JDBC行级锁

    行级锁又称为悲观锁 for update 如下(必须要等这个for updaste事务执行完毕以后,剩下的sql语句才可以去执行)

  4. Data Base System.Data.OracleClient requires Oracle client software version 8.1.7 or greater解决方案

    System.Data.OracleClient requires Oracle client software version 8.1.7 or greater解决方案 一.问题: 1.通过Syst ...

  5. Ajax上传文件注意事项

    如图: 因为传进来的参数被预先处理了,所以才出现了illegal invocation报错,只要将processData的值改为false就能解决这个小问题: 因为JQ自动的帮我们设置了请求头,但是a ...

  6. MySQL 5.0的my.cnf配置选项(另外一种方式分类整理)

    一.   mysqld程序--目录和文件 basedir = path 使用给定目录作为根目录(安装目录). Show variables like “basedir”   //数据库中查看目录 da ...

  7. Oracle数据控制语言(DCL)

    数据控制语言 用来授予或者回收访问数据库中的各种对象,如表 .视图 .索引 等 基本的操作如下: --创建用户 CREATE USER jim IDENTIFIED BY changeit; --给用 ...

  8. Django个人博客开发 | 前言

    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...

  9. SP7258 SUBLEX - Lexicographical Substring Search

    \(\color{#0066ff}{ 题目描述 }\) 给定一个字符串,求排名第k小的串 \(\color{#0066ff}{输入格式}\) 第一行给定主串(len<=90000) 第二行给定询 ...

  10. luogu2253 好一个一中腰鼓!

    先说一个小trick,一开始我们把他赋值成是红.白相间的,查询就查询的是全红或全白即可. 然后就可以做啦 题解里面好像都是线段树 暴力的题解好像都被del了 貌似暴力交上去也过不了了 然后我想说 分块 ...