何百万もの正規表現を置き換える(perl)

イジー

100万行を超えるテキストを含むテキストファイルがあります。各行には、名前で置き換える必要のある英数字コードがあります。さまざまなPerlスクリプトを使用してこれを実行しようとしましたが、使用するメモリが多すぎるためにスクリプトが停止するたびに。私はPerlを初めて使用するので、何か間違ったことをしていると思います。それが仕事を複雑にしすぎているのでしょうか。これまでのところ、私は試しました:

use strict;
use warnings;

my $filename = 'names.txt';

my $data = read_file($filename);

$data =~ s/88tx0p/Author1/g;
##and then there are 1,000,000+ other substitution regexes.

write_file($filename, $data);
exit;

sub read_file {
my ($filename) = @_;

open my $in, '<:encoding(UTF-8)', $filename or die "Could not open 
'$filename' for reading $!";
local $/ = undef;
my $all = <$in>;
close $in;

return $all;
}

sub write_file {
my ($filename, $content) = @_;

open my $out, '>:encoding(UTF-8)', $filename or die "Could not open 
'$filename' for writing $!";;
print $out $content;
close $out;

return;
}

しかし、その後、このスクリプトが出力を元のファイルに書き込もうとしていることに気付きました。これは、より多くのメモリを使用していると思いますか?だから私は以下を試しました:

use strict;
use utf8;
use warnings;

open(FILE, 'names.txt') || die "File not found";
my @lines = <FILE>;
close(FILE);

my @newlines;
foreach(@lines) {
$_ =~ s/88tx0p/Author1/g;
##and then there are approximately 1,000,000 other substitution regexes.
push(@newlines,$_);
}

open(FILE, '>names_edited.txt') || die "File not found";
;
print FILE @newlines;
close(FILE);

しかし、繰り返しになりますが、これはメモリを使いすぎました。最小限のメモリを使用しながらこれを行う方法についてサポートをいただけますか?皆さん、ありがとうございました。

地味な

あなたの問題はあなたがforeachループを使用していることですそれには、すべての行をメモリにロードする必要があります。これが問題の根本です。

whileループで試してください:

open ( my $file, '<', 'names.txt' ) or die $!; 
open ( my $output, '>', 'names_edited.txt' ) or die $!;
select $output; #destination for print; 
while ( <$file> ) {  #reads one line at a time, sets $_
    s/88tx0p/Author1/g;   #acts on $_ by default
    print; #defaults to printing $_ to the selected filehandle $output
}

これは(最初のコードのように)行ごとに機能しますが、一度に1行しか読み取らないため、メモリフットプリントは大幅に少なくなります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

正規表現を何らかの条件に置き換える

分類Dev

Perl正規表現の単語の一部を置き換える

分類Dev

perl正規表現の一致で1文字を置き換える

分類Dev

JavaでUnicode文字以外のものを置き換える正規表現

分類Dev

文字列の少なくとも5桁を置き換える正規表現

分類Dev

特定の「。」を置き換える正規表現 '_'への表記

分類Dev

複数の一致を対応する置換に置き換えるためのperl正規表現

分類Dev

Sedは正規表現パターンを何も置き換えません

分類Dev

1つの置換で2つの別々のものを別々に置き換える正規表現

分類Dev

正規表現の外の単語を置き換える

分類Dev

CDATA内の<と>を置き換えるNotepad ++の正規表現

分類Dev

文字列内の数字を置き換えるFO正規表現

分類Dev

Javaの部分文字列を置き換える正規表現

分類Dev

JavaScript正規表現-数値以外の文字を置き換える

分類Dev

正規表現のGroup2を置き換える

分類Dev

Java正規表現、特定の文字を置き換える

分類Dev

正規表現内の文字を置き換える

分類Dev

正規表現一致内の文字を置き換える

分類Dev

ホスト名の正規表現を置き換える

分類Dev

特定の文字を置き換えるPythonre.sub正規表現

分類Dev

正規表現の部分文字列を置き換えるgolang

分類Dev

キー、括弧内の値を置き換える正規表現

分類Dev

正規表現とPHPの置き換えを改善する

分類Dev

画像タグ内の文字を置き換える正規表現

分類Dev

タグを置き換えるための正規表現

分類Dev

複数の空白行を置き換える正規表現

分類Dev

Javascriptの算術演算子を置き換える正規表現

分類Dev

括弧内のhtmlタグを置き換える正規表現

分類Dev

文字列の「n / a」を置き換えるJavascript正規表現

Related 関連記事

  1. 1

    正規表現を何らかの条件に置き換える

  2. 2

    Perl正規表現の単語の一部を置き換える

  3. 3

    perl正規表現の一致で1文字を置き換える

  4. 4

    JavaでUnicode文字以外のものを置き換える正規表現

  5. 5

    文字列の少なくとも5桁を置き換える正規表現

  6. 6

    特定の「。」を置き換える正規表現 '_'への表記

  7. 7

    複数の一致を対応する置換に置き換えるためのperl正規表現

  8. 8

    Sedは正規表現パターンを何も置き換えません

  9. 9

    1つの置換で2つの別々のものを別々に置き換える正規表現

  10. 10

    正規表現の外の単語を置き換える

  11. 11

    CDATA内の<と>を置き換えるNotepad ++の正規表現

  12. 12

    文字列内の数字を置き換えるFO正規表現

  13. 13

    Javaの部分文字列を置き換える正規表現

  14. 14

    JavaScript正規表現-数値以外の文字を置き換える

  15. 15

    正規表現のGroup2を置き換える

  16. 16

    Java正規表現、特定の文字を置き換える

  17. 17

    正規表現内の文字を置き換える

  18. 18

    正規表現一致内の文字を置き換える

  19. 19

    ホスト名の正規表現を置き換える

  20. 20

    特定の文字を置き換えるPythonre.sub正規表現

  21. 21

    正規表現の部分文字列を置き換えるgolang

  22. 22

    キー、括弧内の値を置き換える正規表現

  23. 23

    正規表現とPHPの置き換えを改善する

  24. 24

    画像タグ内の文字を置き換える正規表現

  25. 25

    タグを置き換えるための正規表現

  26. 26

    複数の空白行を置き換える正規表現

  27. 27

    Javascriptの算術演算子を置き換える正規表現

  28. 28

    括弧内のhtmlタグを置き換える正規表現

  29. 29

    文字列の「n / a」を置き換えるJavascript正規表現

ホットタグ

アーカイブ