68user's page 掲示板

Prev< No. 3319〜3324> Next  [最新発言に戻る] [過去ログ一覧]
No. 3319 # スナフキン 2003/08/29 (金) 05:22:17
perlでテキスト処理をしていますが、有るリストをキーとしたハッシュ
を生成したんですが、そのキーとなるファイルのサイズが110Mb程、キー数
(レコード数)は約1000万弱のレコードが有ります。

そのハッシュのキーを使い別のCSVのフィールドの中に同じキーが存在
する場合に必要な処理を行なっています。
if(exists $KEY{$csv_key_field}){ 処理 }

で、実際に動かすと500Mbのメモリを使い切り(何故?)、1Gbのスワップ
さえも使いきり止まってしまいます。

根本的にこのアルゴリズム自体が悪いのか、それとも何かメモリ使用量を
抑える解決方法があるのか教えてください。

ちなみに、キーとなるデータを配列に格納して grep で検索するとさらに
べらぼうに時間が掛かります。

具体的には2つのリストの合成処理なんですが、このくらいの規模になると
DBに置き換えて処理した方が良いのでしょうか?
(最終的には何らかのDBに格納されるそうです)

もちろん、変数は可能な限り局所化しています。(つもりです(^^;)

もっと言えば、上記は最大サイズのリストではありますが、キーリストは
複数あり、それらを順繰りに処理しています。

どうぞお助けくださいm(_ _)m

No. 3320 # 68user 2003/08/29 (金) 22:28:24
>>3319 スナフキン
> そのキーとなるファイルのサイズが110Mb程、キー数(レコード数)は
> 約1000万弱のレコードが有ります。
全体のデータ容量がわからないですが、仮に 300MB 程度だとしても、
1.5GB 喰い尽くしてもおかしくないかなぁとは思います。

perl の内部構造は知りませんが、スカラー 1つ、配列の一要素、
ハッシュ 1キーなど、それぞれに必ず何バイトかずつ管理用データを
perl が保持しているからです。

実感としては、100MB 程度でもデータの持ち方次第ではまともに
動かないこともあるんじゃないかと思います。

> このくらいの規模になるとDBに置き換えて処理した方が良いので
> しょうか?
perl でもがんばれば何とかなるかもしれませんが (実データはファイルに
保存し、ハッシュにアクセスされるたびに tie でそのファイルを見にいくとか)、
    1. データが固定長 (もしくは最大長が決まっている)
    2. CSV の項目名や項目長が変わる可能性は少ない
    3. 処理内容が変わる可能性が少しでもある
          (この条件に引っかかるレコードは除外する、とか)
であれば、DB に突っ込んだ方がよろしいのではないでしょうか。
わたしならそうします。

項目名や項目長も変わるかもしれないなら、DBD::CSV モジュールとか
(使ったことないですけど)。

No. 3321 # スナフキン 2003/08/29 (金) 23:36:11
助言ありがとうございます。

>仮に 300MB 程度だとしても、1.5GB 喰い尽くしてもおかしくないかなぁとは思います。
うーんやはりそうですか。

データの持ち方の影響も大きいとは思いますが、ハッシュは内部で
キーのインデックスを作っているために、キー全体のデータよりも
相当数のメモリを食うのかな?となんとなく考えていましたが、
まさかこれほどとは思いませんでした。

> 1. データが固定長 (もしくは最大長が決まっている)
> 2. CSV の項目名や項目長が変わる可能性は少ない
> 3. 処理内容が変わる可能性が少しでもある
> (この条件に引っかかるレコードは除外する、とか)
>であれば、DB に突っ込んだ方がよろしいのではないでしょうか。
2と3は該当するので、DBに変換して処理する方向でやってみます。

ただ、元の入力ソースの総合計が2.6Gbも有るので、DB化する事に
かかる時間やファイル占有量がわからなくてその選択肢を選びま
せんでした。

全て書き直しになりそうだ・・・汗

No. 3322 # 岩崎 [E-mail] 2003/09/01 (月) 13:06:04
突然のメールですみません。
岩崎と申します。

実は、WebでMewの操作について探していたところ、貴殿を拝見し、
もしかしたら、下記の対応方法をご存じなのではないかと思い、
メールをお送りさせていただいております。

お忙しいとは思われますが、もし、ご存じでしたならば対処方法を
教えてください。

----
質問
----
現在、MewにてMailチェックをしております。
emacs上でM-x Mewとタイプするとパスワードが聞かれると同時に
過去のMail(以前受信したMail)も表示されます。

しかし、昨晩より、M-x Mewと打ち込んでも新規に受信したmail
しか閲覧できません。おかしいとおもい、Mail/inbox配下を
見たところ、確かに1〜3500件までは入っております。

再度、「i」コマンドで新しいMailを受信すると、受信したMailは
3501件目と表示されますが、3500件目より以前のmailは見えません。
「Shift-O」で順番を整理すると、整理はできるようです。

Mewにて何故か?見えなくなった過去のMailを見えるようにするには
どのようにすればよろしいのでしょうか?

ご存じであれば、教えてください。
よろしくお願いいたします。

また、できれば、CCでiwanov@relief.ne.jpまで情報を転送
いただければ幸甚です。、

No. 3323 # pyontan [E-mail] 2003/09/02 (火) 08:07:32
ご存知の方がいらっしゃれば、教えてください。
UNIXサーバで、あるファイルがなくなりました。
いつ、どのように消えてしまったかを知る術はあるのでしょうか?
領域不足で、優先度が低く削除されたとか、
誰かがrmコマンドを実行したとか…。
教えてください。

No. 3324 # 68user 2003/09/05 (金) 01:04:28
>>3322 岩崎
Mew のことは http://www.mew.org で質問した方が早く解決すると思います。


>>3323 pyontan
> いつ、どのように消えてしまったかを知る術はあるのでしょうか?
残念ながら、よっぽど特別な仕掛けでも仕込んでおかない限り
無理だと思います。

> 領域不足で、優先度が低く削除されたとか、
さすがにこれはないでしょう。ちなみに UNIX では、ファイルに
優先度という概念はないです。

> 誰かがrmコマンドを実行したとか…。
というようなログも、一般的な UNIX では用意されていないです。

Prev< No. 3319〜3324> Next  [最新発言に戻る] [過去ログ一覧]