`
jandyfish
  • 浏览: 16015 次
社区版块
存档分类
最新评论

python增量计算

阅读更多
    在rsync同步数据后,因业务需要以及文件大小限制,需要对数据做增量分析,而每次都需要拿出文件的增量部分。
    linux有差异计算命令diff以及补丁工具patch,都不是很符合预期。这两种工具都是需要对两个文件进行对比,而若如此做的话,其一计算增量耗时,其二需要有一个原数据的副本文件。多余的副本文件会导致额外的存储开销,以及数据移动成本。
    又因同步过来的数据是多个application的数据,需要针对不同的app进行增量计算,提交给相应的计算任务。希望每次在rsync后直接做增量计算,这里就考虑到直接使用python脚本编写。
   
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import getopt
import sys
import fnmatch  

from datetime import datetime,timedelta,date

#判断是否为新一天的开始,数据文件是按日保存,凌晨定时任务需要对前日的数据进行增量计算
def is_newday_begin(app,daystr):
	file_day_file='/var/local/diff_file_storage/day_'+app
	if os.path.exists(file_day_file):
		try:
			day_file=open(file_day_file,'r')
			oldday=day_file.read()
			if oldday != daystr:
				return True
		finally:
			day_file.close()
	return False
	
def read_position(app,daystr,file):
	file_day_file='/var/local/diff_file_storage/day_'+app
	if os.path.exists(file_day_file):
		try:
			day_file=open(file_day_file,'r')
			oldday=day_file.read()
			if oldday != daystr:
				day_file.close()
				day_file=open(file_day_file,'w+')
				day_file.write(daystr)
				write_position(daystr,file,0)
		finally:
			day_file.close()
	else:
		try:
			day_file=open(file_day_file,'w+')
			day_file.write(daystr)
		finally:
			day_file.close() 
		
        
	position=None
	open_file=None
	position_file=file+'_'+daystr
	try:
		if os.path.exists(position_file):
			open_file=open(position_file,'r')
			position = long(open_file.read())
		else:
			position=0
	finally:
		if open_file is not None:
			open_file.close()
	print 'read from ',position_file
	return position

def write_position(daystr,file,position):
	open_file=None
	position_file=file+'_'+daystr
	try:
		open_file=open(position_file,'w+')
		open_file.write(str(position))
	finally:
		if open_file is not None:
			open_file.close()
	print 'write to ',position_file

def read_diff(app,day,outpath,times):
	filepath='/data/dc_files/'+app+day.strftime('/%Y/%m')
	if is_newday_begin(app,day.strftime('%Y-%m-%d')) and times <= 0:
		read_diff(app,day+timedelta(days=-1),outpath,times+1)
		print 'read_diff old day : ',day
	#get old position of file
	file_position=0
	file_position_dir='/var/local/diff_file_storage/position/'
	filenames=os.listdir(filepath)
				
	if not filepath.endswith('/'):
		filepath = filepath + '/'
	filepre = app+'_'+day.strftime('%Y-%m-%d')+'_' 
        target_file=open(outpath,'a')
	try:
		for line in filenames:
			if line.startswith(filepre):
				print 'read_diff: flush file ',line
				file_position_path=file_position_dir+app+'_'+line.replace(filepre,'')
				#read position from temp
				oldposition = read_position(app,day.strftime('%Y-%m-%d'),file_position_path)
				position=oldposition
				print 'read_diff: old position is ',position
			
				#read data,change position
				try:
					source_file=open(filepath+line,'r')
					#target_file=open(outpath,'w')
					source_file.seek(oldposition)
					for temp_line in source_file:
						target_file.write(temp_line)
						position = position+len(temp_line)
					
				finally:
					source_file.close()
					if position==oldposition:
						#os.remove(outpath)
						print outpath,' empty data'	
				#write position back to temp
				write_position(day.strftime('%Y-%m-%d'),file_position_path,position)
				print 'read_diff: new position is ',position
	finally:
		target_file.close()
    

    如上所示,是diff计算的demo代码。对每次增量计算的位移量进行保存,下次再进行增量计算时,就可以从位移量处直接读取。
    比之用diff,path少了副本相应开销,速度也可观。增加main后也可以直接在shell中调用。


    实现为module,则如下代码所示:
   
    #! /usr/bin/env python
# Filename:diffmodule.py
# -*- coding: utf-8 -*-

import os
import getopt
import sys
import fnmatch

#read diff from sfile to ofile by position_file cached
def read_diff(position_file,sfile,ofile):
        old_position=read_position(position_file)
        tmp_position=0
        source_file=None
        target_file=None
        try:
                source_file=open(sfile,'r')
                source_file.seek(old_position)
                target_file=open(ofile,'a')
                for temp_line in source_file:
                        target_file.write(temp_line)
                        tmp_position = tmp_position+len(temp_line)
        finally:
                if source_file is not None:
                        source_file.close()
                if target_file is not None:
                        target_file.close()
        if not tmp_position==0:
                write_position(position_file,tmp_position+old_position)
        return tmp_position

# read position from file
def read_position(position_file):
        position=None
        open_file=None
        try:
                if os.path.exists(position_file):
                        open_file=open(position_file,'r')
                        position = long(open_file.read())
                else:
                        position=0
        finally:
                if open_file is not None:
                        open_file.close()
        return position

#write position to file
def write_position(position_file,position):
        open_file=None
        result = False
        try:
                open_file=open(position_file,'w+')
                open_file.write(str(position))
        finally:
                if open_file is not None:
                        open_file.close()
                        result = True
        return result
    


   如上代码可供参考,在python 2.7.3下测试OK。
分享到:
评论

相关推荐

    固定增量法_iris_python_

    这样做的好处包括节省内存、控制计算资源以及实现在线学习或增量学习。 描述中提到的是利用Anaconda环境对鸢尾花(Iris)数据集进行三类分类。鸢尾花数据集是机器学习领域非常经典的数据集,包含了三种不同鸢尾花的...

    基于python程序设计的计算思维能力培养.pdf

    本篇文章探讨了如何利用Python程序设计来培养计算思维能力。在信息化技术迅猛发展的今天,计算思维能力已成为当代人才不可或缺的技能之一。文章首先指出了当前计算机领域教学的主要内容,即程序构成、软件开发以及...

    python PID模拟控制

    在这个主题中,我们将深入探讨Python如何实现PID算法,以及增量式和位置式PID控制的区别。 首先,让我们了解PID的基本原理。PID控制器的输出是当前误差(P)、过去误差的积分(I)和误差变化率的负数(D)的组合。...

    android增量更新python脚本差分包

    Python脚本在增量更新过程中可以起到关键作用,通过比对新旧版本的差异,生成差分包,进而实现高效、节省流量的更新策略。以下将详细介绍这一技术及其背后的原理。 一、增量更新原理 1. **全量更新与增量更新的...

    python 计算方位角实例(根据两点的坐标计算)

    首先,通过坐标增量计算方位角的步骤包括: 1. 计算两个坐标点在x轴和y轴方向的坐标差,即dx = x2 - x1和dy = y2 - y1。 2. 根据dx和dy的值确定方位角。若dx不为0而dy为0,根据dx的正负确定方位角为0°或180°;若dy...

    第九章:增量式爬虫_Python爬虫教程_

    在Python中实现增量式爬虫,通常会涉及到以下几个关键知识点: 1. **URL管理器**:这是增量式爬虫的核心部分,负责跟踪已抓取和待抓取的URL。你可以使用Python的`set`或`list`数据结构来存储这些URL,或者使用...

    基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明(高分项目)

    基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明(高分项目)基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明(高分项目)基于半监督密度聚类和增量学习的故障诊断系统python源码+...

    五种形式的宽度学习BLS代码,python语言

    宽度学习(Broad Learning System,BLS)是一种新兴的机器学习框架,它结合了深度学习的并行计算优势...这个Python实现的BLS代码库提供了基础模型和多种增量策略,对于想要尝试宽度学习的开发者来说是一个宝贵的资源。

    基于半监督密度聚类和增量学习的故障诊断系统python源码(项目说明+代码注释拉满.zip

    基于半监督密度聚类和增量学习的故障诊断系统python源码(项目说明+代码注释拉满 【项目说明】 整体架构 故障诊断模块 半监督标记模块 增量更新模块 故障诊断模块读取设备监测数据,根据数据判断设备是否处于正常状态...

    基于Python 实现半监督密度聚类+增量学习的故障诊断

    【作品名称】:基于Python 实现半监督密度聚类+增量学习的故障诊断 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...

    用Python写脚本,实现完全备份和增量备份的示例

    本篇文档介绍了一种使用Python脚本实现完全备份和增量备份的实例,主要涉及到的操作和知识点包括以下几点: 1. Python脚本编写基础: - 使用Python标准库中的os、hashlib、cPickle、tarfile、time等模块来完成备份...

    (源码)基于Python和Jenkins的增量代码分析系统.zip

    # 基于Python和Jenkins的增量代码分析系统 ## 项目简介 这是一个基于Python和Jenkins的增量代码分析系统,旨在通过获取SVN或Jira中的增量代码信息,结合Jacoco工具生成代码覆盖率报告。系统适用于持续集成和持续...

    基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明+代码注释拉满.zip

    基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明+代码注释拉满.zip在工业系统中,机械设备在运行过程中会产生数据流,不断变化且缺乏标签,使得基于深度学习的故障诊断方法难以在这种环境下有效工作...

    经典排序算法PYTHON版

    常用的排序算法,使用PYTHON实现,包括:插入排序、选择排序、快速排序、希尔排序(附多种增量生成算法)、堆排序、归并排序

    BPNN_pythonBPNN_python_BPNN_BPNNPython_bpnn算法_

    在Python中实现BPNN算法,可以利用其强大的科学计算库如NumPy和SciPy,以及专门的机器学习库如Scikit-learn和TensorFlow。 Python BPNN实现的基本步骤包括以下几个关键部分: 1. **网络结构设计**:BPNN通常由输入...

    Python scrapy增量爬取实例及实现过程解析

    标题中提到的“Python scrapy增量爬取”是指在使用Python编程语言开发网络爬虫时,采用Scrapy框架实现增量爬取的方法。增量爬取是一种智能的爬虫技术,旨在只获取目标网站自上次爬取后更新或新增的数据,以此减少对...

    基于知识蒸馏的目标检测模型增量深度学习方法的python源码(高分项目).zip

    基于知识蒸馏的目标检测模型增量深度学习方法的python源码(高分项目).zip个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为...

Global site tag (gtag.js) - Google Analytics