我有256个目录,每个目录有大约55,000个dicom文件(这些不是文本文件)。每个文件都有我需要提取的元数据,设置指定的变量,然后插入到mysql(实际上是MariaDB)。
我需要按原样保留原始文件,因此首先将文件从256个目录中的一个从附加存储复制到本地目录,执行另一个处理项,然后浏览列表并处理每个文件。复制和第一个过程大约需要20分钟。
之后我在本地删除所有文件,然后转到下一个目录。
以下是我认为可以优化的部分,但我不确定如何...如果这是一个单行程序肯定,但我认为太多必须发生。
我通过对文件($ i)获取dcm2txt命令的输出来设置变量(all-tags),然后设置我需要的变量"重新回显"为每个人。这是最有效的方式吗?我刚刚处理的测试目录需要花费3个多小时来处理大约55,000个文件,包括20分钟的复制和第一个处理,因此这部分需要2小时40分钟。只有255个目录......
logger -t "admin" "loc 2: Truncating files in $PROCESS_DIR"
find $PROCESS_DIR -type f -print0 | xargs -0 /usr/bin/truncate -s -512 {}
cd $PROCESS_DIR
for i in `find . -type f -printf '%f\n'`
do
all_tags=$(/home/admin/securecloud/dcm4che-2.0.29/bin/dcm2txt -w 150 $i)
VARsrc_aet=$(echo "$all_tags" | awk '/0002,0016/' | cut -d "[" -f2 | cut -d "]" -f1)
VARsop_cuid=$(echo "$all_tags" | awk '/0008,0016/' | cut -d "[" -f2 | cut -d "]" -f1)
VARsop_iuid=$(echo "$all_tags" | awk '/0008,0018/' | cut -d "[" -f2 | cut -d "]" -f1)
VARstudy_date=$(echo "$all_tags" | awk '/0008,0020/' | cut -d "[" -f2 | cut -d "]" -f1)
VARacquis_date=$(echo "$all_tags" | awk '/0008,0022/' | cut -d "[" -f2 | cut -d "]" -f1)
VARcontent_date=$(echo "$all_tags" | awk '/0008,0023/' | cut -d "[" -f2 | cut -d "]" -f1)
VARstudy_time=$(echo "$all_tags" | awk '/0008,0030/' | cut -d "[" -f2 | cut -d "]" -f1)
VARacqis_time=$(echo "$all_tags" | awk '/0008,0032/' | cut -d "[" -f2 | cut -d "]" -f1)
VARcontent_time=$(echo "$all_tags" | awk '/0008,0033/' | cut -d "[" -f2 | cut -d "]" -f1)
VARaccession_no=$(echo "$all_tags" | awk '/0008,0050/' | cut -d "[" -f2 | cut -d "]" -f1)
VARmodality=$(echo "$all_tags" | awk '/0008,0060/' | cut -d "[" -f2 | cut -d "]" -f1)
VARinstitution=$(echo "$all_tags" | awk '/0008,0080/' | cut -d "[" -f2 | cut -d "]" -f1)
VARseries_desc=$(echo "$all_tags" | awk '/0008,103E/' | cut -d "[" -f2 | cut -d "]" -f1)
VARops_name=$(echo "$all_tags" | awk '/0008,1070/' | cut -d "[" -f2 | cut -d "]" -f1)
VARmanu_model=$(echo "$all_tags" | awk '/0008,1090/' | cut -d "[" -f2 | cut -d "]" -f1)
VARpat_name=$(echo "$all_tags" | awk '/0010,0010/' | cut -d "[" -f2 | cut -d "]" -f1)
VARpat_id=$(echo "$all_tags" | awk '/0010,0020/' | cut -d "[" -f2 | cut -d "]" -f1)
VARpat_birthdate=$(echo "$all_tags" | awk '/0010,0030/' | cut -d "[" -f2 | cut -d "]" -f1)
VARpat_comments=$(echo "$all_tags" | awk '/0010,4000/' | cut -d "[" -f2 | cut -d "]" -f1)
VARstudy_iuid=$(echo "$all_tags" | awk '/0020,000D/' | cut -d "[" -f2 | cut -d "]" -f1)
VARseries_iuid=$(echo "$all_tags" | awk '/0020,000E/' | cut -d "[" -f2 | cut -d "]" -f1)
VARstudy_id=$(echo "$all_tags" | awk '/0020,0010/' | cut -d "[" -f2 | cut -d "]" -f1)
VARseries_no=$(echo "$all_tags" | awk '/0020,0011/' | cut -d "[" -f2 | cut -d "]" -f1)
VARinst_no=$(echo "$all_tags" | awk '/0020,0013/' | cut -d "[" -f2 | cut -d "]" -f1)
DB_NAME=ingestion_dir
TABLE=dicom_files
mysql -uname -ppassword $DB_NAME <<EOF
INSERT INTO $TABLE (src_aet,sop_cuid,sop_iuid,study_date,acquis_date,content_date,study_time,acqis_time,\
content_time,accession_no,modality,institution,series_desc,ops_name,manu_model,pat_name,\
pat_id,pat_birthdate,pat_comments,study_iuid,series_iuid,study_id,series_no,inst_no,filename) \
VALUES \
( "$VARsrc_aet", "$VARsop_cuid","$VARsop_iuid", "$VARstudy_date", "$VARacquis_date", "$VARcontent_date", "$VARstudy_time", "$VARacqis_time", \
"$VARcontent_time", "$VARaccession_no", "$VARmodality", "$VARinstitution", "$VARseries_desc", "$VARops_name", "$VARmanu_model", "$VARpat_name", \
"$VARpat_id", "$VARpat_birthdate", "$VARpat_comments", "$VARstudy_iuid", "$VARseries_iuid", "$VARstudy_id", "$VARseries_no", "$VARinst_no", "$i" );
EOF
done