次のPerlスクリプトを作成して、作業中のファイル操作を処理しましたが、実行速度が遅すぎて本番環境に移行できません。
私はPerlをよく知らないので(私の言語の1つではありません)、誰かがこのスクリプトの処理が最大4,000万行であることを考えると遅い部分を特定して置き換えるのを手伝ってもらえますか?
パイプされるデータの形式は次のとおりです。
col1|^|col2|^|col3|!|
col1|^|col2|^|col3|!|
... 40 million of these.
date_cols配列は、スクリプトのこの部分の前に計算され、基本的に、事前に変換された形式の日付を含む列のインデックスを保持します。
これは、すべての入力行に対して実行されるスクリプトの一部です。少しクリーンアップしてコメントを追加しましたが、他に必要なものがあればお知らせください。
## Read from STDIN until no more lines are arailable.
while (<STDIN>)
{
## Split by field delimiter
my @fields = split('\|\^\|', $_, -1);
## Remove the terminating delimiter from the final field so it doesn't
## interfere with date processing.
$fields[-1] = (split('\|!\|', $fields[-1], -1))[0];
## Cycle through all column numbres in date_cols and convert date
## to yyyymmdd
foreach $col (@date_cols)
{
if ($fields[$col] ne "")
{
$fields[$col] = formatTime($fields[$col]);
}
}
print(join('This is an unprintable ASCII control code', @fields), "\n");
}
## Format the input time to yyyymmdd from 'Dec 26 2012 12:00AM' like format.
sub formatTime($)
{
my $col = shift;
if (substr($col, 4, 1) eq " ") {
substr($col, 4, 1) = "0";
}
return substr($col, 7, 4).$months{substr($col, 0, 3)}.substr($col, 4, 2);
}