最近有个需求,就是数据源那边会过来许多api数据,样例如下:
1 2 3 4 5
| /api/login/001-1,10.145.205.53:10081,GET,100 /api/login/001-2,10.145.205.53:10081,GET,100 /api/login/001-3,10.145.205.53:10081,GET,100 /api/login/001-4,10.145.205.53:10081,GET,100 /api/login/index,10.145.205.53:10081,POST,100
|
可以看到过来的数据除了id字段,其余部分是一样的,这样就造成了数据的重复占用资源,理想的情况是将数据合并成下面的情况:
1 2
| /api/login/{id},10.145.205.53:10081,GET,100 /api/login/index,10.145.205.53:10081,POST,100
|
用 {id}
来替代无意义的段,并且后面要加入合并出来的/api/login/{id}
占总数据量的百分比,PM要求的处理速度是10w条/s,目前做的是第一版,后续会更新第二版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| import re,math,datetime from collections import Counter
def main(): file = open("C:\\Users\\lkm86\\Desktop\\data.csv", "r", encoding="utf-8") content = file.readlines()
patternList = [] patternBranch = [] patternDict = {}
pattern = re.compile('\/[^\\/]*\d[^\\/]*\/')
for lines in content: line = lines[:lines.index(",")] if line[-1] != "/": line += "/" if pattern.findall(line): url = pattern.sub('/{id}/', line) patternList.append(url + lines[lines.index(","):].strip()) patternBranch.append(line + lines[lines.index(","):].strip()) else: patternDict[lines.strip()] = math.ceil(1 / len(content) * 100) cnt = Counter(patternList) for key in cnt.keys(): if cnt[key] < 2: str = key[:key.index(",")] reString = str.replace("{id}", "[^\\/]*\d[^\\/]*") for line in patternBranch: if re.compile(reString).findall(line[:line.index(",")]): patternDict[line.strip()] = math.ceil(1 / len(content) * 100) else: patternDict[key] = math.ceil(cnt[key] / len(content) * 100)
if __name__ == '__main__': print("开始时间:") print(datetime.datetime.now()) main() print("结束时间:") print(datetime.datetime.now())
|
我的文件里是11w条数据,测试结果符合需求:
当然,现在第一版只考虑了出现一个{id}
的情况,如果出现像下面的这种数据,这个脚本就不能计算出正确的结果了:
1 2 3 4
| /api/login/001-1/index/1 /api/login/001-2/index/2 /api/login/001-3/index/3 /api/login/001-4/index/4
|
如果出现这种两个甚至多个包含数字的段的情况的话,处理过程就要复杂的多了,这个等后续第二版再来想办法实现。