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符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据的更多相关文章

  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. 1.初学c++,比较困惑的问题。

    1.c++是一门实用的语言吗? c++是一个实用的工具,它很有用. 在工业软件世界中,c++被视为坚实和成熟的主流工具.它具有广泛的行业支持和好批. 2.面向对象编程在c++中的作用? 我们要开发一个 ...

  2. Mac常用开发工具

    1.svn客户端 SVN client SmartSVN 2.git客户端 SourceTree | Free Git GUI for Mac and Windows 3.远程windows系统工具( ...

  3. GetResponse() 基础连接已经关闭:服务器关闭了本应保持活动状态的连接

    1.原因: (1)KeepAlive默认为true,与internet保持持续连接 ,服务器关闭了连接,使用HttpWebResponse.GetResponse()出错 (2)HttpWebRequ ...

  4. CodeSmith链接MySQL

    环境:Win7 x64 旗舰版 CodeSmith Generator Professional 6.5.0 MySQL 5.6.17 x64 在CodeSmith中按一般步骤创建数据库连接 Data ...

  5. nodejs nodejs模块使用及简单的示例

    nodejs模块使用及简单的示例 参考菜鸟教程网:http://www.runoob.com/ 一.fs模块的使用: 1.文件操作: 读文件: //读文件 var fs=require('fs'); ...

  6. 51nod 1350 斐波那契表示(递推+找规律)

    传送门 题意 分析 我们发现该数列遵循下列规律: 1 1,2 1,2,2 1,2,2,2,3 1,2,2,2,3,2,3,3 我们令A[i]表示f[i]开始长为f[i-1]的i的最短表示和 那么得到A ...

  7. Mysql 别名

    一.列别名 1.要给列添加别名,可以使用AS关键词后跟别名,例:SELECT [column_1 | expression] AS descriptive_name FROM table_name; ...

  8. Leetcode 121. Best Time to Buy and Sell Stock 最佳股票售卖时(动态规划,数组,模拟)

    题目描述 已知一个数组,第i个元素表示第i天股票的价格,你只能进行一次交易(买卖各一次),设计算法找出最大收益 测试样例 Input: [7, 1, 5, 3, 6, 4] Output: 5 最大收 ...

  9. vue.js组件之j间的通讯一 子组件接受父祖件数据

    Vue2.0的三种常用传值方式.父传子.子传父.非父子组件传值 在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来.这时必然会产生一些疑问和需求?比如一个组件 ...

  10. Xcode上传appstore 出现 Found an unexpected Mach-O header code: 0x72613c21 错误

    网上说是静态库的问题