記一次800多萬XML文字檔案預處理經歷
一.背景
由於某些需求,現需對系統在最近幾個月生成的xml檔案進行預處理,提取標籤內的資料進行分析。這些需要預處理的資料大概有280GB左右880多萬,存放在gysl目錄下,gysl的下一層按天命名,分為若干個目錄,接下來一層目錄下又有多個目錄,我們所需的xml目錄就在這一層。我們現在需要將此目錄下面的xml檔案使用Python指令碼進行處理,並將處理結果按天(與原始檔一致)儲存到~/temp目錄下。
二.操作過程
2.1 Python指令碼準備。
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import glob,os,sys, re
from concurrent.futures import ProcessPoolExecutor
import argparse
import random
def find_xs(str, list):
i = 0
for i in range(0,len(str)):
if str[i] in list:
return i
return -1
def segement_aux(para, OUT, sep_list, max_length, merge_prob):
pos = 0
res_sentence = ""
sentence_size = 0
while True:
#segment one line.
pos = find_xs(para,sep_list)
if pos == -1:
break
cur_sentence = para[:pos+1].strip()
cur_sentence_filtering = cur_sentence
res_sentence = res_sentence + cur_sentence_filtering
sentence_size = sentence_size + 1
if sentence_size == 2:
OUT.write(res_sentence + `
`)
else:
rand = random.random()
if rand > merge_prob:
OUT.write(res_sentence + `
`)
res_sentence = ""
sentence_size = 0
else:
sentence_size = sentence_size + 1
para = para[pos+1:]
def loadXMLfile(inputfile):
sep_list= [`。`, `?`, `!`]
targetfolder = "Target"
max_length = 100000
merge_prob = 0.6
basefilename =os.path.basename(inputfile)
outputfile = targetfolder + `/`+ os.path.splitext(basefilename)[0] + ".tsv"
textSessionPattern = re.compile(r`<text>(.*?)</text>s*`, re.I|re.MULTILINE)
OUT = open(outputfile, `w`,encoding="utf8")
for line in open(inputfile,encoding="utf8"):
line = line.strip().rstrip("
")
alltextsessions = re.findall(textSessionPattern, line)
for textsession in alltextsessions:
textsession = re.sub(r` `, r` `, textsession)
textsession = re.sub(r`<[^<|>]+>`, r``, textsession)
textsession = re.sub(r`{[^}|{]+}`, r``, textsession)
textsession = re.sub(r`s+`,r``,textsession)
OUT.write(textsession+`
`)
OUT.close()
return outputfile
def processXMLfilesWithThreads(input):
with ProcessPoolExecutor() as executor:
xmlfiles = glob.glob(input + "/*.xml")
for xmlfile, outputfile in zip( xmlfiles, executor.map( loadXMLfile, xmlfiles) ):
print("Processed" + outputfile)
if __name__ == `__main__`:
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True, help="the directory of input files")
args = ap.parse_args()
processXMLfilesWithThreads(input = args.input)
2.2 Shell指令碼準備。
for folder in `find /home/ivandu/gysl -path "*/xml" -print`;do mkdir Target;python3 XMLPreProcess.py --input $folder;mv Target ~/temp/$(echo $folder|awk -F "/" `{print $5}`);done
看著有點費勁,改一下:
#!/bin/bash
for folder in `find /home/ivandu/gysl -path "*/xml" -print`;
do
mkdir Target;
python3 XMLPreProcess.py --input $folder;
mv Target ~/temp/$(echo $folder|awk -F "/" `{print $5}`);
done
2.3 執行指令碼。
此步驟就不展示了,涉及到某些商業機密。在Python指令碼所在的目錄下,執行Shell指令碼就行。
三.遇到問題
3.1 “Argument list too long”。
在執行某目錄下的檔案移動、複製、刪除操作時,發現提示“Argument list too long”,命令執行不成功。這個目錄下的檔案數量超過30萬,操作命令如下:
cp * ~/gysl_test
提示:
-sh: /bin/cp: Argument list too long
解決方案:
for file in `ls`;do cp $file ~/gysl_test/;done
rm,mv也類似,太忙了也就沒繼續探討其他解決方案。
3.2 雙for迴圈執行效率太低。
for folder in `find /home/ivandu/gysl/ -mindepth 2 -maxdepth 2 -print|grep "xml"`;do cd $folder;for file in $(ls);do cp $file ~/gysl_test/;done;done
如果使用這命令來拷貝這些檔案的話,那麼這一天可能就過去了!這個肯定不妥,必須改進。find也用得不夠簡潔,後來都進行優化了。
3.3 Python單執行緒執行效率太低。
Python指令碼使用了多執行緒來進行處理。不過多解釋,大家見諒^_^
四.總結
4.1 總體來說今天處理這些資料還是挺給力的,差不多5000秒就完成了。我寫了一條命令動態觀察了一下。
4.2 正規表示式隨時都能用上,要不是處理一下特殊任務和Python多執行緒,直接一個grep命令寫到shell命令或許早就完事了。
4.3 多執行緒。bash shell中的多執行緒還不會使用,以後還得加強學習一下。
4.4 就寫這麼多了,不足之處還望諸位不吝賜教。
相關文章
- Go xml檔案處理GoXML
- 前端如何處理xml配置檔案?前端XML
- 記一次PMML檔案的處理過程
- C#處理文字檔案概述C#
- 一次在docker中處理kdevtmpfsi的經歷Dockerdev
- XML檔案處理中增加xmlns問題XML
- 記一次dump檔案分析歷程
- 利用 python 遍歷多級資料夾處理不同檔案Python
- 鏈家網8000+萬個檔案何處安家?
- 記一次面試經歷面試
- linux 透過xmllint處理xml檔案LinuxXML
- jQuery如何處理xml檔案程式碼例項jQueryXML
- 大體積XML檔案處理效能問題XML
- Shell指令碼逐行處理文字檔案技巧指令碼
- Linux檔案管理知識:文字處理Linux
- 文字檢測預處理地址
- SPM12之fMRI批次預處理——NII檔案處理
- 記一次vba+word+excel+powerbi處理問卷調研結果的經歷Excel
- 記一次 Google 面試經歷Go面試
- 記錄一次WhatTheFuck經歷
- LayUI多檔案上傳,支援歷史上傳預覽UI
- 文字預處理技術詳解
- 一次控制檔案損壞後的恢復經歷
- 記一次Oracle Sql最佳化經歷--消耗過多CPUOracleSQL
- 大容量XML檔案處理如何解決效能問題XML
- 記一次Oracle 聯機日誌檔案丟失的處理方案Oracle
- 記一次翻譯站經歷
- 記一次 jQuery 踩坑經歷jQuery
- 記一次效能優化經歷優化
- 記一次:歸檔檔案系統問題導致資料庫hang處理資料庫
- Python筆記(五)——檔案處理Python筆記
- 記錄一次微信分享的經歷
- 記一次 CDN 流量被盜刷經歷
- 記一次編譯GCC的經歷編譯GC
- Python編解碼問題與文字檔案處理Python
- 11.9Linux檔案管理知識:文字處理Linux
- JSP筆記-XML 資料處理JS筆記XML
- Python檔案處理-專題筆記Python筆記