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. CodeForces 782B The Meeting Place Cannot Be Changed (二分)

    题意:题意:给出n个人的在x轴的位置和最大速度,求n个人相遇的最短时间. 析:二分时间,然后求并集,注意精度,不然会超时. 代码如下: #pragma comment(linker, "/S ...

  2. 通过ajax把json对象传入后台

    一.前台ajax部分 function icheckDelete(url){ var parms = { list : array //这是个数组 }; $.ajax({ dataType: &quo ...

  3. unit vs单元测试

    vs单元测试(unit) 一.什么是单元测试及它的作用? 在小量代码编写时,往往可以通过新建控制台项目(Console Application),新建网站项目(Web Form)等,在其中敲入测试代码 ...

  4. Linux CentOS 7下Memcached 安装与配置

    前言 本篇文章记录一下Linux CentOS 7中关于Memcached的安装与配置. 安装 安装memcached之前首先需要安装libevent,我这里用的版本是: •libevent-2.0. ...

  5. pch文件的创建与配置

    1.ios中pch文件的创建与配置 1.1 ios中pch文件的创建与配置 1.2 全局宏定义标志的配置 2.宏定义 这里放的主要是开发中常用的宏定义. /** 动态的字符串格式化宏 */ #defi ...

  6. 787. Cheapest Flights Within K Stops

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

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

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

  8. 树状数组【bzoj3155】: Preprefix sum

    3155: Preprefix sum 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3155 把给出的a_i当成查分数组d_i做就可以了 ...

  9. boost库checked_delete的使用

    在查看boost库时发现一个小文件checked_delete.hpp里面几个小函数,它的作用用很简短的话来说:防止未定义的行为造成delete时的内存泄露.实现如下: template<cla ...

  10. cookie和session的使用和区别

    cookie:存储在浏览器 存值:setcookie("名字",值,过期时间.秒,哪一个文件夹)//文件夹不写一般默认整个网站都可以 setcookie("usernam ...