试图清理700,000个数据,反对1500万个数据

时间:2015-07-09 05:49:05

标签: linux shell

我正在尝试清除从单个文件中获取的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文件。

1 个答案:

答案 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行是可行的 - 但如果你能这样做,它应该是最快的。