サポート掲示板
HOME  □ MANUAL  □ 新着記事  □ 新規投稿
ツリー表示  □ 記事全文表示  □ SEARCH  □ 過去ログ
ツリー表示

MESSAGE Speeeeed・文字数の制限? /tokuhon (12/02/12(Sun) 16:37) [1124]
....MESSAGE Re[1]: Speeeeed・文字数の制限? /Akky (12/02/13(Mon) 23:03) [1125]
........MESSAGE Re[2]: Speeeeed・文字数の制限? /tokuhon (12/02/14(Tue) 12:47) [1126]
............MESSAGE Re[3]: Speeeeed・文字数の制限? /Akky (12/02/14(Tue) 16:33) [1128]
................MESSAGE Re[4]: Speeeeed・文字数の制限? /tokuhon (12/02/14(Tue) 17:15) [1129] 解決済み!
............MESSAGE Re[3]: Speeeeed・文字数の制限? /Akky (12/02/14(Tue) 16:11) [1127]


親記事 / ▼[ 1125 ]
NO.1124  Speeeeed・文字数の制限?
□投稿者/ tokuhon -(2012/02/12(Sun) 16:37:54)
□U R L/
【ソフト名】
Speeeeed
【バージョン】
1.51
【使用OS】
WindowsXP SP3
【PC機種】
NEC ValueStarNX他
【質問内容】
前後にたくさんのnullがあるアスキーファイルの前後のnull等を消すために、下記の置換えリストで置換を試みたところ、
-----
[\d\D]*%\r\n([^\x00]+)\x00+[\d\D]* $1 Em
-----
前後のnullが10,000個あるファイルは置換ができませんでした。
「正規表現置換えを全てBREGEXP.DLLに任せる」にチェックなしだと、
下記のエラーになります。
-----
Microsoft Visual C++ Runtime Library
Runtime Error!
Program: C:\Program
Files\Speeeeed\Speeeeed.exe
abnormal program termination
-----
「正規表現置換えを全てBREGEXP.DLLに任せる」にチェックありだと、エラー表示なしでSpeeeeedが落ちます。
試しに5,000個に減らしてみると置換できました。
何か制限等ありますでしょうか?



▲[ 1124 ] / ▼[ 1126 ]
NO.1125  Re[1]: Speeeeed・文字数の制限?
□投稿者/ Akky -(2012/02/13(Mon) 23:03:36)
□U R L/
基本的に制限は設けてませんが環境的な上限は当然ながら存在します。
多分4GB以上のファイルでは異常起こしますし他にも色々有るかと思いますが把握はしてません。
正規表現検索については検索パターンによっては大量のメモリを消費します。
それによりメモリを食いつぶせばエラーが発生します。
多分その辺りのエラー処理が多完全なのでアプリごと落ちてると思いますが
もしきちんとエラー処理してたとしても置き換えは失敗します。
正規表現のパターンを見なおして下さい。



▲[ 1125 ] / ▼[ 1128 ] ▼[ 1127 ]
NO.1126  Re[2]: Speeeeed・文字数の制限?
□投稿者/ tokuhon -(2012/02/14(Tue) 12:47:32)
□U R L/
回答ありがとうございます。

◇メモリ=512MB・Cドライブの空き=1.3GBのパソコン
◇メモリ=2GB・Cドライブの空き=120GBのパソコン
どちらのパソコンも、前後のnullは10,000文字でその間のテキストは数文字しかない20KB程度のファイルでも同じ現象なので、環境は関係ないのかなと思いました。

とりあえず今回は2段階で置換して不都合を回避しました。
-----
\x00+ \x00 Em
[\d\D]*%\r\n([^\x00]+)\x00+[\d\D]* $1 Em
-----

メモリ=2GB・Cドライブの空き=120GBのパソコンにて、StrawberryPerl(v5.12.3)で同じパターンを用いて試してみると、100,000,000文字まで増やしても問題なく置換できます。(1,000,000,000文字だと「Out of memory!」)
-----
for my $infile (</temp/hoge>){
if(-f $infile){
my $outfile = $infile . '.out';
open(IN, '<', $infile) or die"can not open <$infile>:$!";
binmode(IN);
open(OUT, '>', $outfile) or die"can not open <$outfile>:$!";
binmode(OUT);
local $/ = undef;
my $lines = <IN>;
$lines =~ s/[\d\D]*%\r\n([^\x00]+)\x00+[\d\D]*/$1/;
print OUT $lines;
close(OUT);
close(IN);
}
}
-----
(Akkyさんにお聞きすることではない気もしますが)これほども差があるのでしょうか?



▲[ 1126 ] / ▼[ 1129 ]
NO.1128  Re[3]: Speeeeed・文字数の制限?
□投稿者/ Akky -(2012/02/14(Tue) 16:33:02)
□U R L/
追記

もしかしたらbregonig.dllなら動くかもしれませんね。
http://homepage3.nifty.com/k-takata/mysoft/bregonig.html

# K.Takata氏によるBregexp.dll互換の正規表現ライブラリです。



▲[ 1128 ] / 返信無し
NO.1129  Re[4]: Speeeeed・文字数の制限?
□投稿者/ tokuhon -(2012/02/14(Tue) 17:15:24)
□U R L/
解決済み!
回答ありがとうございます。

bregexp.dllからbregonig.dll(bron301.zip内)に変更したところ、前後のnullが10,000,000文字でも置換できるようになりました。
これなら充分許容値内です。

お騒がせしてすみませんでした。



▲[ 1126 ] / 返信無し
NO.1127  Re[3]: Speeeeed・文字数の制限?
□投稿者/ Akky -(2012/02/14(Tue) 16:11:25)
□U R L/
BREGEXP.DLLの正規表現がどんな計算をしてるのかは全くわかりませんが
もし指数関数的に使用メモリが増えていくような処理をしてるのなら
元の数値が倍になっただけで結果は何万倍になってもおかしくは無いです。
例えば1.003の5000乗は3メガですが10000乗なら10テラにもなります。
こうなると古いパソコンも新しいパソコンもそう変わりはありません。
# 勿論こんな単純では無いですがイメージ的に。

正規表現のエンジンも日々進歩してますし
ライブラリによって処理方法も異なります。
こちらのライブラリで出来る事があちらのライブラリでは出来ないとか
その逆も有って然りだと思います。

正規表現については奥が深く難しいので詳しいことはわかりませんがそんな気がします。



- Child Tree -