以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据
- import datetime
- import sys
- import oss2
- from itertools import islice
- import pandas as pd
- import re
- import json
- from pandas.tseries.offsets import Day
- from multiprocessing import Process, JoinableQueue, cpu_count, Manager
- import time
- def mkbuck(bk):
- auth = oss2.Auth(username, password)
- bucket = oss2.Bucket(auth, address, bk)
- return bucket
- #获取前天最后一小时的paths
- def getbflastpt(bucket, bfyespattern):
- bfpamax = []
- for bf in islice(oss2.ObjectIterator(bucket, prefix=bfyespattern), sys.maxsize):
- c = bf.key
- if c[-1:] != '/':
- bfpamax.append(int(c.split('/')[4]))
- last = pd.Series(bfpamax).unique().max()
- if last < 10:
- bflastpt = bfyespattern + '/0' + str(last)
- else:
- bflastpt = bfyespattern + '/' + str(last)
- return bflastpt
- #获取当天第一个小时的paths
- def getnowfirstpt(bucket, nowpattern):
- bfpamin = []
- for bf in islice(oss2.ObjectIterator(bucket, prefix=nowpattern), sys.maxsize):
- c = bf.key
- if c[-1:] != '/':
- bfpamin.append(int(c.split('/')[4]))
- first = pd.Series(bfpamin).unique().min()
- if first < 10:
- nowfirstpt = nowpattern + '/0' + str(first)
- else:
- nowfirstpt = nowpattern + '/' + str(first)
- return nowfirstpt
- #获取所有的昨日paths,并合并得到完全的paths和数量
- def getfullnum(bk, bfyespattern, nowpattern, yespattern):
- lists = []
- bucket = mkbuck(bk)
- bfyespattern = getbflastpt(bucket, bfyespattern)
- nowpattern = getnowfirstpt(bucket, nowpattern)
- timelist = (s for s in (bfyespattern, yespattern, nowpattern))
- for pter in timelist:
- for bf in islice(oss2.ObjectIterator(bucket, prefix=pter), sys.maxsize):
- c = bf.key
- lists.append(c)
- return lists, len(lists)
- #以下为进程间通信,即生产者、消费者模型
- def getfull(bk, bfyespattern, nowpattern, yespattern, q):
- lists, num = getfullnum(bk, bfyespattern, nowpattern, yespattern)
- for c in lists:
- q.put(c)
- q.join()
- def consumer(bk, q, d):
- bucket = mkbuck(bk)
- repattern2 = re.compile('{.*"adadji",.*}')
- while True:
- js = []
- ress = q.get()
- if ress[-1:] != '/':
- remote_data = bucket.get_object(ress).read().decode('utf-8')
- aa = (d for d in repattern2.findall(remote_data))
- for a in aa:
- temdic = json.loads(a)
- if (starttime <= temdic['created_at']) and (temdic['created_at'] <= endtime):
- js.append(temdic)
- df = pd.DataFrame(js, columns=['dd','cc'])
- d[ress] = df##d为通过主进程Manager共享变量将数据取出
- # print(ress)
- q.task_done()# 向q.join()发送一次信号,证明一个数据已经被取走了
- if __name__ == '__main__':
- s1 = time.time()
- now_time = datetime.datetime.now() # 获取当前时间
- bfyes_time = (now_time - 2 * Day()).strftime('%Y/%m/%d')
- yes_time = (now_time - 1 * Day()).strftime('%Y/%m/%d')
- yesdate = (now_time - 1 * Day()).strftime('%Y-%m-%d')
- yesdate1 = (now_time - 1 * Day()).strftime('%Y%m%d')
- endtime = (now_time - 1 * Day()).strftime('%Y-%m-%d 23:59:59')
- starttime = (now_time - 1 * Day()).strftime('%Y-%m-%d 00:00:00')
- nowdate = now_time.strftime('%Y/%m/%d')
- bk = 'xxx'
- bfyespattern = '%s/%s' % (bk, bfyes_time)
- yespattern = '%s/%s' % (bk, yes_time)
- nowpattern = '%s/%s' % (bk, nowdate)
- q = JoinableQueue(cpu_count())
- m = Manager()
- d = m.dict() ##创建进程间的共享内存字典,方便各个进程处理好的数据
- p1 = Process(target=getfull, args=('xx', bfyespattern, nowpattern, yespattern, q))
- #####生成consumer多进程
- cc = []
- for c in range(cpu_count() - 1):
- c1 = Process(target=consumer, args=('xx', q, d))
- cc.append(c1)
- p_l = [p1]
- for c in cc:
- c.daemon = True
- p_l.append(c)
- for p in p_l:
- p.start()
- p1.join()
- d = d.values()
- df1 = pd.concat(d, ignore_index=True)
- df1.sort_values('created_at', inplace=True)
- print(time.time() - s1)
- print('=' * 20)
- print(df1)
说明:需求为获取昨日的数据即可,因oss实时数据存储可能存在提前或延迟情况,因此读取前天的最后一小时,昨日全部,当天最开始一小时数据,读者可根据自身情况进行修改
以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据的更多相关文章
- Pandas之:Pandas高级教程以铁达尼号真实数据为例
Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...
- zTree实现获取一级节点数据
zTree实现获取一级节点数据 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</t ...
- request.getParameter()获取不到数据
HTML中的form表单有一个关键属性 Content-Type=application/x-www-form-urlencoded 或multipart/form-data. 1. Content- ...
- python从数据库获取全量数据的方法
python从数据库获取全量数据的方法 学习了:https://blog.csdn.net/lom9357bye/article/details/79503658 原文膜拜: import psyco ...
- request.getParameter()获取不到数据的问题
最近做项目时,发现手机客户端通过http协议post方式上传数据到服务端,在服务器端通过request.getInputStream()能获取到相应的数据,但用request.getParameter ...
- Oracle根据符合条件的数据循环批量更新
--批量对符合条件的表记录进行更新 --aa代表查询出的符合条件数据的别名 --aa后的表示需要符合的条件 --loop后开始写更新操作 begin for aa in (select a.objec ...
- 查询同一张表符合条件的某些数据的id拼接成一个字段返回
同一张表存在类似多级菜单的上下级关系的数据,查询出符合条件的某些数据的id拼接成一个字段返回: SELECT CONCAT(a.pid, ',', b.subid) AS studentIDS FRO ...
- 深度学习实践-物体检测-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 ...
- Shell 筛选符合条件的 ELF 文件
0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机 ...
随机推荐
- 使用IDEA开发SPARK提交remote cluster执行
开发环境 操作系统:windows 开发工具:IntelliJ IDEA 14.1.1 需要安装scala插件 编译环境:jdk 1.7 scala 2.10.4 使用IDEA开发spark应用 ...
- map集合的应用
分析以下需求,并用代码实现: (1)利用键盘录入,输入一个字符串 (2)统计该字符串中各个字符的数量例如 用户输入字符串"If~you-want~to~change-your_fate_I_ ...
- JDBC行级锁
行级锁又称为悲观锁 for update 如下(必须要等这个for updaste事务执行完毕以后,剩下的sql语句才可以去执行)
- 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 ...
- Ajax上传文件注意事项
如图: 因为传进来的参数被预先处理了,所以才出现了illegal invocation报错,只要将processData的值改为false就能解决这个小问题: 因为JQ自动的帮我们设置了请求头,但是a ...
- MySQL 5.0的my.cnf配置选项(另外一种方式分类整理)
一. mysqld程序--目录和文件 basedir = path 使用给定目录作为根目录(安装目录). Show variables like “basedir” //数据库中查看目录 da ...
- Oracle数据控制语言(DCL)
数据控制语言 用来授予或者回收访问数据库中的各种对象,如表 .视图 .索引 等 基本的操作如下: --创建用户 CREATE USER jim IDENTIFIED BY changeit; --给用 ...
- Django个人博客开发 | 前言
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...
- SP7258 SUBLEX - Lexicographical Substring Search
\(\color{#0066ff}{ 题目描述 }\) 给定一个字符串,求排名第k小的串 \(\color{#0066ff}{输入格式}\) 第一行给定主串(len<=90000) 第二行给定询 ...
- luogu2253 好一个一中腰鼓!
先说一个小trick,一开始我们把他赋值成是红.白相间的,查询就查询的是全红或全白即可. 然后就可以做啦 题解里面好像都是线段树 暴力的题解好像都被del了 貌似暴力交上去也过不了了 然后我想说 分块 ...