优化perl脚本以根据文件中的日期过滤行

用户名

我是编程的初学者,不仅是perl!请让我知道需要更改的内容或如何进行更改。

需要优化perl代码以使其运行更快。对于一个大约500MB的文件(其中包含300万行)的测试运行,运行时间为28分钟。

我知道一个工具可以在15分钟内处理3900万行,但是我想在不使用该工具的情况下在命令提示符下运行该工具。

早些时候,我使用Date :: Manip和Date :: Parse并转到DateTime,以为它应该更快。

我的方法是,如果日期是ISO-8601(即YYYY-MM-DD),而我们不需要验证它们,则可以按字典顺序进行比较(即lt和gt运算符)。

  • 输入文件日期格式为2013年7月18日13:45:49
  • 输入文件大小42GB。
  • 行数3900万。
  • 列分隔符:|〜|
  • 平台:GNU / Linux

我已经尝试了“>”和“ gt”,但在运行时没有发现任何差异。

Code snippet:

use DateTime::Format::Strptime;

my $idate = "07/17/2013 00:00:00";

my $Strp = DateTime::Format::Strptime->new(
                   pattern     => '%m/%d/%Y %H:%M:%S',
                  );

my $inputdt = $Strp->parse_datetime($idate);

open (FILE,"myinputfile.dat") or die "could not input File\n";
while (defined(my $line = <FILE>)) {
    my @chunks = split '[|]~[|]', $line;
    my $fdate = $Strp->parse_datetime($chunks[6]);
    if ( $fdate > $inputdt) {
    open(FILEOUT, ">>myoutputfile.dat") or die "Could not write\n";
    print FILEOUT "$line";
                         }
}
close(FILE);
close (FILEOUT);
阿蒙

这里有两个半大的性能问题:

  1. 您可以在每次迭代中打开输出文件。只需在循环之前将其打开一次即可。
  2. parse_datetime返回一个DateTime对象。Perl的面向对象意味着大量的开销。因为您的模式定义良好,所以我们可以自行分析并删除所有面向对象的方向。
  3. 读取GB范围内的文件仅需要一些时间。为了加快速度,请升级硬件(例如,升级到SSD)。

要将日期字符串解析为可排序的表示形式,我们只需将各个部分重新排序为字符串即可:

# %m/%d/%Y %H:%M:%S → %Y/%m/%d %H:%M:%S
$fdate =~ s{^ ([0-9]{2} / [0-9]{2}) / ([0-9]{4}) }{$2/$1}x;

if ($fdate gt $inputdate) { ... }

这将导致代码

use strict; use warnings;

use constant DATE_FIELD => shift @ARGV;

my $inputdate = shift @ARGV;
$inputdate =~ s{^ ([0-9]{2} / [0-9]{2}) / ([0-9]{4}) }{$2/$1}x;

<>; # remove the header line

while (<>) {
    my $filedate = (split /\|~\|/, $_, DATE_FIELD + 2)[DATE_FIELD];
    $filedate =~ s{^ ([0-9]{2} / [0-9]{2}) / ([0-9]{4}) }{$2/$1}x;
    print if $filedate gt $inputdate;
}

输入和输出以及开始日期在命令行上指定,例如

./script 6 '07/17/2013 00:00:00' myinputfile.dat >>myoutputfile.dat

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建脚本以根据日期或文件名移动文件

来自分类Dev

Perl脚本从文件中删除行

来自分类Dev

根据日期过滤表行

来自分类Dev

Shell脚本以文本文件中的T + 2更新日期(T)

来自分类Dev

如何制作 Bash 脚本以更改 CSV 文件中的日期格式

来自分类Dev

根据日期列过滤数据框中的行

来自分类Dev

修改python脚本以在文件中的一行中搜索数字范围

来自分类Dev

Perl脚本以捕获文本标题并添加到行

来自分类Dev

如何编写bash脚本以根据名称将文件复制到新文件夹中?

来自分类Dev

如何根据reactjs中的日期范围选择(开始日期-结束日期)过滤表格行?

来自分类Dev

通过使用Shell脚本以修改后的日期进行过滤,将文件从hdfs文件夹复制到另一个hdfs位置

来自分类Dev

根据一行中的连续数字过滤.CSV文件

来自分类Dev

编写Bash脚本以根据命令中的参数数量下载可变数量的.gitignore文件吗?

来自分类Dev

修改Perl脚本以在给定目录中为具有指定扩展名的每个文件运行

来自分类Dev

如何根据日期时间过滤文件?

来自分类Dev

awk根据日期条件过滤行

来自分类Dev

根据不同的日期要求过滤行

来自分类Dev

PowerShell脚本以解析根文件夹中的文件

来自分类Dev

如何使用Mac编写bash脚本以获取具有相同日期的文件并将其放入具有该日期的文件夹中

来自分类Dev

编写脚本以根据给定条件过滤文本报告并输出所需值

来自分类Dev

如何优化bash脚本以多种模式解析多个gzip压缩文件?

来自分类Dev

优化Shell脚本以替换多个sed

来自分类Dev

过滤文件中的行

来自分类Dev

根据熊猫中的特定年份和月份从多个日期列中过滤行

来自分类Dev

创建shell脚本以从指定目录中删除某些文件

来自分类Dev

Sed脚本以大写文本文件中的“ I”

来自分类Dev

在Linux中运行Shell脚本以处理多个.grb文件

来自分类Dev

从文件中读取文本以在 bash 脚本中使用变量

来自分类Dev

如何编写脚本以自动优化MediaWiki图像目录中的所有PNG?

Related 相关文章

  1. 1

    创建脚本以根据日期或文件名移动文件

  2. 2

    Perl脚本从文件中删除行

  3. 3

    根据日期过滤表行

  4. 4

    Shell脚本以文本文件中的T + 2更新日期(T)

  5. 5

    如何制作 Bash 脚本以更改 CSV 文件中的日期格式

  6. 6

    根据日期列过滤数据框中的行

  7. 7

    修改python脚本以在文件中的一行中搜索数字范围

  8. 8

    Perl脚本以捕获文本标题并添加到行

  9. 9

    如何编写bash脚本以根据名称将文件复制到新文件夹中?

  10. 10

    如何根据reactjs中的日期范围选择(开始日期-结束日期)过滤表格行?

  11. 11

    通过使用Shell脚本以修改后的日期进行过滤,将文件从hdfs文件夹复制到另一个hdfs位置

  12. 12

    根据一行中的连续数字过滤.CSV文件

  13. 13

    编写Bash脚本以根据命令中的参数数量下载可变数量的.gitignore文件吗?

  14. 14

    修改Perl脚本以在给定目录中为具有指定扩展名的每个文件运行

  15. 15

    如何根据日期时间过滤文件?

  16. 16

    awk根据日期条件过滤行

  17. 17

    根据不同的日期要求过滤行

  18. 18

    PowerShell脚本以解析根文件夹中的文件

  19. 19

    如何使用Mac编写bash脚本以获取具有相同日期的文件并将其放入具有该日期的文件夹中

  20. 20

    编写脚本以根据给定条件过滤文本报告并输出所需值

  21. 21

    如何优化bash脚本以多种模式解析多个gzip压缩文件?

  22. 22

    优化Shell脚本以替换多个sed

  23. 23

    过滤文件中的行

  24. 24

    根据熊猫中的特定年份和月份从多个日期列中过滤行

  25. 25

    创建shell脚本以从指定目录中删除某些文件

  26. 26

    Sed脚本以大写文本文件中的“ I”

  27. 27

    在Linux中运行Shell脚本以处理多个.grb文件

  28. 28

    从文件中读取文本以在 bash 脚本中使用变量

  29. 29

    如何编写脚本以自动优化MediaWiki图像目录中的所有PNG?

热门标签

归档