■掲示板に戻る■ 全部 1- 最新50

シェルスクリプト(awk含む)でのエラー

1 :名無しさん@お腹いっぱい。 :2001/04/19(木) 09:17
シェルに詳しい方、有識者の方々に質問です。

100万行近くあるテキストファイルをawkを使用して編集、出力しよう
としているのですが途中で以下のようなエラーが発生してしまいます。
@「forkで失敗した」
-> プロセス上限値越え?
A「空き領域を使い切った」
-> メモリに情報をのっけきれなかった?

上記エラーが発生したときには、上記エラーメッセージしか
出力されません。

仮に、textファイルが、a.txtとしたら

cat a.txt | awk '{ ... }' | awk '{ ... }' | awk '{ ... }'

のように、awkをパイプでつないで処理しています。

そこで、質問ですが

@パイプでawkをつなぐと、最後のawkが終わるまで
プロセスはおわらないものなのでしょうか?
それとも、負荷がかかってしまうのでしょうか?

Aawkでつないでいる間、awkで処理していない行や
awkで処理している行はメモリに乗っていると思うのですが、
あまりにも行が大きいためどこかにswapしていると思います。
どこに吐き出されるのでしょうか?

どうぞ、よろしくお願いします。


2 :壊れたデバイスさん :2001/04/19(木) 12:58
普通はスクリプトファイル書いて
% awk -f foo.awk
じゃない?

3 :名無しさん@お腹いっぱい。 :2001/04/19(木) 13:05
スクリプトみせてもらわんと分からんが、
中にデータを溜め込みすぎてない?
巨大な配列とか。

4 :名無しさん@お腹いっぱい。 :2001/04/19(木) 13:17
>>1
一行が1MBとかじゃないなら、パイプで目に見えるほどメモリを食ったりしない


5 :1 :2001/04/19(木) 13:23
>>2
そういうやり方もありますが、パイプでもできます。

>>3
いや、100万行くらいあるんスよ......

>>4
そうなんですか?うーん......

6 :名無しさん@お腹いっぱい。 :2001/04/19(木) 13:32
>>1
どいつが一番メモリを食っているか調べてみたの?

7 :名無しさん@お腹いっぱい。 :2001/04/19(木) 14:38
無印awkだと-mr -mfなどのオプションで使用メモリを増やせます。
gawkは内部制限はないようです。
forkなんとかのエラーとは関係なさそうだけど参考までに。

8 :1 :2001/04/19(木) 15:19
>>6
shellの変数にその結果をとってるのですが、そこで
OutOfMemoryがでていました。やはり、ファイルにおとして
やるしかないのでしょうか??

>>7
無印awkのバージョンが古いらしく、-m*オプションが使用できません(泣




9 :名無しさん@お腹いっぱい。 :2001/04/19(木) 16:29
ワークファイルでも使ってawkを1個ずつ流してもダメなのか?>>1


10 : :2001/04/19(木) 17:23
だ〜か〜ら。
データが100万行あっても、1行処理してはprint,1行処理してはprint,
とやってればそんなのはでないのないのかなとおもた。

でも、たとえば、

{
 array[$1]=なんごかかんとか
}
とかやって、巨大な配列になってないか聞いてるんですが?

で、7さんにみたいにしてきりわけないさいな。

awk -f '{ }' a.txt >tmp1
awk -f '{ }' tmp1 >tmp2
awk -f' '{ } tmp2 >tmp3
とかやってどこで落ちるかしらべれ。
落ちなきゃこれでやればいいし、そこでパイプラインを疑うべし。



11 : :[ここ壊れています]
[ここ壊れています]

12 :3=10 :2001/04/19(木) 17:43
だから、つべこべ言わずに、やってみれ。
美しい、美しくないの前にどこに原因があるのか切れ分けれ。
もうつきあわん。

13 :3=10=11 :2001/04/19(木) 17:44
訂正
10で
7さんみたいに->9さんみたいに。

14 :3=10=12 :2001/04/19(木) 17:49
私も馬鹿だな。=11だって.....
>>11
10の言ってる内容がわかってないな......
awk '{ ... }' のひとつの中に10のようなことをしてないかきいてるんだけど。
つき合わんといいつつ書いてる馬鹿>わし


15 :名無しさん@お腹いっぱい。 :2001/04/19(木) 18:00
>>11
最初からそう書け
変数に百万行の結果を流し込めばメモリ不足になって当たり前だろ。ヴォケ

16 :名無しさん@お腹いっぱい。 :2001/04/19(木) 18:01
>>15
激しく同意!
awkもパイプも関係ねーよ>>1


17 :壊れたデバイスさん :2001/04/19(木) 18:04
/bin/sh なら '{
...
}
{
...
}'
みたいにクォート内に改行を入れられないか?
なぜ awk ばかり数珠繋ぎ?
アルゴリズムを見直したほうがいいんじゃ?

18 :17 :2001/04/19(木) 18:07
って >>15 で落ちがついてるじゃん。鬱だ…

19 :名無しさん :2001/04/19(木) 18:12
メモリ追加しましょう

20 :19 :2001/04/19(木) 18:13
つか、実行中に swap -l とか top とか見てる?

21 :19 :2001/04/19(木) 18:43
swap -l ってSolaris固有か・・・
FreeBSD なら swapinfo 、 Linux はわからんかった
どれでも top ならみられるみたいだけどな

22 :???????????????B :2001/04/19(木) 22:11
>>15
>>16
とりあえず1がアホなのは決定だが (質問してるのに必要な
情報を提示できないようでは、UNIX スキル以前の問題)、
  A=`cat a.txt | awk '{ ... }' | awk '{ ... }' `
については最後の awk の出力がどれくらいあるか
わからないことには、何とも言えんぞよ。


23 :名無しさん@お腹いっぱい。 :2001/04/20(金) 00:39
なーんでawkに(すぃかもパイプに)拘るかな。

以前の管理者が残したものを、わけがわからずそのまま使ってみた
という可能性を考えてみる。


続きを読む

掲示板に戻る 全部 次100 最新50
名前: E-mail (省略可) :

read.cgi ver5.26+ (01/10/21-)