提高分拣计划的效率;在终端

时间:2015-06-20 04:04:13

标签: python perl sorting unix

我有一个大的管道分隔输入文件大约600万行,如下所示:

24|BBG000SJFVB0|EQ0000000009296012|OI SA-ADR|OIBR/C|US|ADR|Equity 16|BBG002PHVB83|EQ0000000022353186|BLOOM SELECT INCOME FUND|BLB-U|CT|Closed-End Fund|Equity
-50|BBG000V0TN75|EQ0000000010271114|MECHEL-PREF SPON ADR|MTL/P|US|ADR|Equity 20|BBG002S0ZR60|EQ0000000022739316|DIVIDEND 15 SPLIT CORP II-RT|DF-R|CT|Closed-End Fund|Equity
-20|BBG001R3LGM8|EQ0000000017879513|ING FLOATING RATE SENIOR LOA|ISL/U|CT|Closed-End Fund|Equity 0|BBG006M6SXL2|EQ0000000006846232|AA PLC|AA/|LN|Common Stock|Equity
  

要求如下:
  1.我需要按照该顺序对第一列,第二列,第二列进行排序   2.在终端/控制台中显示排序完成百分比,例如"第2列75%完成排序"
  3.最后输出一个单独的文件。

我已经编写了下面的程序,它完全按第一列排序。 但如何融入所有其他条件?现在它还需要更多的时间来运行。有没有更有效和更清洁的方法呢?唯一的问题是我们无法使用CPAN的任何其他外部包。像使用SED / AWK这样的Unix解决方案是可以的,但Perl更可取。我刚才知道内置的Python也在那里,所以也欢迎解决方案。

my (%link_strength);
{$data="datascope_input.txt";
 $out="sort_file.txt";
open (my $indata , '<', $data)|| die "could not open $data :\n$!";
open (my $outdata , '>', $out)|| die "could not open $out :\n$!";
select $outdata;
my @array=(<$indata>);
for (@array){
    $link_strength{$1}=$_  if /(?:[^|]+\|){0}([^|]+)/;
            }
print $link_strength{$_} for (sort {$a<=>$b} keys %link_strength);
  close ($outdata);
  close ($indata);
}

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,Linux / Unix系统排序可能会表现得更好,但如果你真的想要Perl,那就可以解决这个问题:

Control nextControl;

if (e.KeyCode == Keys.Enter)
{     
    nextControl = GetNextControl(ActiveControl, !e.Shift);
    if (nextControl == null)
    {
        nextControl = GetNextControl(null, true);
    }
    nextControl.Focus();

    TextBox box = nextControl as TextBox;
    if (box != null)
        box.Select(box.Text.Length, 0);

    e.SuppressKeyPress = true;
}

正如我在评论中所说,我知道无法自省收集进度信息。你可以通过计算发生了多少次比较来破解某些东西,但由于你永远无法确定最终的数字,因此无法计算完成百分比。

答案 1 :(得分:0)

从您的示例数据中,您将排序大约950MB。从普通高清(100MB / s)读取需要9.5秒。我不知道标准sort的排序速度有多快,但根据我的经验,它可以为每个CPU核心提供1-3百万条记录。比方说100万。在双核上需要3秒,在具有更多CPU核心的服务器上需要更少。我认为大部分时间都会读取和解析您的数据。这么简单

pv -p your_file.dat | sort -t'|' -k '1n,1' -k '2d,2' -k '14,14'

应该完成大部分必需的功能。