在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。
分享到:
相关推荐
这样做的好处包括节省内存、控制计算资源以及实现在线学习或增量学习。 描述中提到的是利用Anaconda环境对鸢尾花(Iris)数据集进行三类分类。鸢尾花数据集是机器学习领域非常经典的数据集,包含了三种不同鸢尾花的...
本篇文章探讨了如何利用Python程序设计来培养计算思维能力。在信息化技术迅猛发展的今天,计算思维能力已成为当代人才不可或缺的技能之一。文章首先指出了当前计算机领域教学的主要内容,即程序构成、软件开发以及...
在这个主题中,我们将深入探讨Python如何实现PID算法,以及增量式和位置式PID控制的区别。 首先,让我们了解PID的基本原理。PID控制器的输出是当前误差(P)、过去误差的积分(I)和误差变化率的负数(D)的组合。...
Python脚本在增量更新过程中可以起到关键作用,通过比对新旧版本的差异,生成差分包,进而实现高效、节省流量的更新策略。以下将详细介绍这一技术及其背后的原理。 一、增量更新原理 1. **全量更新与增量更新的...
首先,通过坐标增量计算方位角的步骤包括: 1. 计算两个坐标点在x轴和y轴方向的坐标差,即dx = x2 - x1和dy = y2 - y1。 2. 根据dx和dy的值确定方位角。若dx不为0而dy为0,根据dx的正负确定方位角为0°或180°;若dy...
在Python中实现增量式爬虫,通常会涉及到以下几个关键知识点: 1. **URL管理器**:这是增量式爬虫的核心部分,负责跟踪已抓取和待抓取的URL。你可以使用Python的`set`或`list`数据结构来存储这些URL,或者使用...
基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明(高分项目)基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明(高分项目)基于半监督密度聚类和增量学习的故障诊断系统python源码+...
宽度学习(Broad Learning System,BLS)是一种新兴的机器学习框架,它结合了深度学习的并行计算优势...这个Python实现的BLS代码库提供了基础模型和多种增量策略,对于想要尝试宽度学习的开发者来说是一个宝贵的资源。
基于半监督密度聚类和增量学习的故障诊断系统python源码(项目说明+代码注释拉满 【项目说明】 整体架构 故障诊断模块 半监督标记模块 增量更新模块 故障诊断模块读取设备监测数据,根据数据判断设备是否处于正常状态...
【作品名称】:基于Python 实现半监督密度聚类+增量学习的故障诊断 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:...
本篇文档介绍了一种使用Python脚本实现完全备份和增量备份的实例,主要涉及到的操作和知识点包括以下几点: 1. Python脚本编写基础: - 使用Python标准库中的os、hashlib、cPickle、tarfile、time等模块来完成备份...
# 基于Python和Jenkins的增量代码分析系统 ## 项目简介 这是一个基于Python和Jenkins的增量代码分析系统,旨在通过获取SVN或Jira中的增量代码信息,结合Jacoco工具生成代码覆盖率报告。系统适用于持续集成和持续...
基于半监督密度聚类和增量学习的故障诊断系统python源码+项目说明+代码注释拉满.zip在工业系统中,机械设备在运行过程中会产生数据流,不断变化且缺乏标签,使得基于深度学习的故障诊断方法难以在这种环境下有效工作...
常用的排序算法,使用PYTHON实现,包括:插入排序、选择排序、快速排序、希尔排序(附多种增量生成算法)、堆排序、归并排序
在Python中实现BPNN算法,可以利用其强大的科学计算库如NumPy和SciPy,以及专门的机器学习库如Scikit-learn和TensorFlow。 Python BPNN实现的基本步骤包括以下几个关键部分: 1. **网络结构设计**:BPNN通常由输入...
标题中提到的“Python scrapy增量爬取”是指在使用Python编程语言开发网络爬虫时,采用Scrapy框架实现增量爬取的方法。增量爬取是一种智能的爬虫技术,旨在只获取目标网站自上次爬取后更新或新增的数据,以此减少对...
基于知识蒸馏的目标检测模型增量深度学习方法的python源码(高分项目).zip个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为...