我正在尝试清除从单个文件中获取的70万个数据,这些数据需要根据多个文件中存在的1500万个数据进行清理。
示例:1个700 000的文件说A.多个文件池有1500万个叫它B. 我想要一个没有文件A数据的文件池B.
下面是我试图使用它的shell脚本工作正常。但是擦洗需要花费8个多小时的时间。
IFS=$'\r\n' suppressionArray=($(cat abhinav.csv1))
suppressionCount=${#suppressionArray[@]}
cd /home/abhinav/01-01-2015/
for (( j=0; j<$suppressionCount; j++));
do
arrayOffileNameInWhichSuppressionFound=`grep "${suppressionArray[$j]}," *.csv| awk -F ':' '{print $1}' > /home/abhinav/fileNameContainer.txt`
IFS=$'\r\n' arrayOffileNameInWhichSuppressionFound=($(cat /home/abhinav/fileNameContainer.txt))
arrayOffileNameInWhichSuppressionFoundCount=${#arrayOffileNameInWhichSuppressionFound[@]}
if [ $arrayOffileNameInWhichSuppressionFoundCount -gt 0 ];
then
echo -e "${suppressionArray[$j]}" >> /home/abhinav/emailid_Deleted.txt
for (( k=0; k<$arrayOffileNameInWhichSuppressionFoundCount; k++));
do
sed "/^${suppressionArray[$j]}/d" /home/abhinav/06-07-2015/${arrayOffileNameInWhichSuppressionFound[$k]} > /home/abhinav/06-07-2015/${arrayOffileNameInWhichSuppressionFound[$i]}".tmp" && mv -f /home/abhinav/06-07-2015/${arrayOffileNameInWhichSuppressionFound[$i]}".tmp" /home/abhinav/06-07-2015/${arrayOffileNameInWhichSuppressionFound[$i]}
done
fi
done
我想到的另一个解决方案是将700k数据分解为50K的较小尺寸文件并发送到5个可用服务器,每个服务器也可以使用POOL A. 每个服务器都将用于2-Smaller文件。
答案 0 :(得分:1)
这两行很奇怪:
AmCharts.makeChart("stackedChart", {
"type": "serial",
"theme": "light",
"legend": {
"position": "right",
"useGraphSettings": true,
},
"dataProvider": data,
"valueAxes": [{
"stackType": "regular",
"axisAlpha": 0.3,
"gridAlpha": 0,
"position": "left",
"gridCount": 5
}],
"plotAreaFillAlphas": 0.1,
"graphs": graph,
"categoryField": "Period",
"categoryAxis": {
"gridPosition": "start",
"labelFrequency": 5,
},
"export": {
"enabled": true
}
});
第一个将空字符串分配给英里长的变量名称,因为标准输出定向到文件。然后第二个将该文件读入数组。 (&#39;好奇的是,该名称不是arrayOffileNameInWhichSuppressionFound=`grep "${suppressionArray[$j]}," *.csv| awk -F ':' '{print $1}' > /home/abhinav/fileNameContainer.txt`
IFS=$'\r\n' arrayOffileNameInWhichSuppressionFound=($(cat /home/abhinav/fileNameContainer.txt))
,但arrayOfFileNameInWhichSuppressionFound
的小写f
是一致的,所以我想除了制作它之外并不重要更难阅读变量名。)
这可以简化为:
file
你不应该在IFS中保持马车回报;要么永久设置,要么确保在开始之前没有回车符。
你正在运行这些循环7,00,000次(使用印度符号)。这很重要。难怪它需要几个小时。你需要把事情分组在一起。
您应该简单地从ArrFileNames=( $(grep -l "${suppressionArray[$j]}," *.csv) )
获取行并安排将它们转换为适当的abhinav.csv1
命令,然后将它们拆分并应用它们。沿着:
sed
这使用sed 's%.*%/&,/d%' abhinav.csv1 > names.tmp
split -l 500 names.tmp sed-script.
for script in sed-script.*
do
sed -f "$script" -i.bak *.csv
done
选项备份文件。如果-i
不支持sed
选项,则可能需要明确地进行重定向:
-i
您应该尝试查看脚本的大小。我在 for file in *.csv
do
sed -f "$script" "$file" > "$file.tmp" &&
mv "$file.tmp" "$file"
done
命令中选择了500作为适度的妥协。除非您使用的是古老的HP-UX,否则这应该是安全的,但您可以更多地增加脚本的大小,这将减少您编辑每个文件的次数,从而加快处理速度。如果你可以使用5,000或50,000,你应该这样做。试验看看上限是多少。我不确定你是否发现一次完成所有700,000行是可行的 - 但如果你能这样做,它应该是最快的。