|
perlでテキスト処理をしていますが、有るリストをキーとしたハッシュ を生成したんですが、そのキーとなるファイルのサイズが110Mb程、キー数 (レコード数)は約1000万弱のレコードが有ります。 そのハッシュのキーを使い別のCSVのフィールドの中に同じキーが存在 する場合に必要な処理を行なっています。 if(exists $KEY{$csv_key_field}){ 処理 } で、実際に動かすと500Mbのメモリを使い切り(何故?)、1Gbのスワップ さえも使いきり止まってしまいます。 根本的にこのアルゴリズム自体が悪いのか、それとも何かメモリ使用量を 抑える解決方法があるのか教えてください。 ちなみに、キーとなるデータを配列に格納して grep で検索するとさらに べらぼうに時間が掛かります。 具体的には2つのリストの合成処理なんですが、このくらいの規模になると DBに置き換えて処理した方が良いのでしょうか? (最終的には何らかのDBに格納されるそうです) もちろん、変数は可能な限り局所化しています。(つもりです(^^;) もっと言えば、上記は最大サイズのリストではありますが、キーリストは 複数あり、それらを順繰りに処理しています。 どうぞお助けくださいm(_ _)m |
|
>>3319 スナフキン > そのキーとなるファイルのサイズが110Mb程、キー数(レコード数)は > 約1000万弱のレコードが有ります。 全体のデータ容量がわからないですが、仮に 300MB 程度だとしても、 1.5GB 喰い尽くしてもおかしくないかなぁとは思います。 perl の内部構造は知りませんが、スカラー 1つ、配列の一要素、 ハッシュ 1キーなど、それぞれに必ず何バイトかずつ管理用データを perl が保持しているからです。 実感としては、100MB 程度でもデータの持ち方次第ではまともに 動かないこともあるんじゃないかと思います。 > このくらいの規模になるとDBに置き換えて処理した方が良いので > しょうか? perl でもがんばれば何とかなるかもしれませんが (実データはファイルに 保存し、ハッシュにアクセスされるたびに tie でそのファイルを見にいくとか)、 1. データが固定長 (もしくは最大長が決まっている) 2. CSV の項目名や項目長が変わる可能性は少ない 3. 処理内容が変わる可能性が少しでもある (この条件に引っかかるレコードは除外する、とか) であれば、DB に突っ込んだ方がよろしいのではないでしょうか。 わたしならそうします。 項目名や項目長も変わるかもしれないなら、DBD::CSV モジュールとか (使ったことないですけど)。 |
|
助言ありがとうございます。 >仮に 300MB 程度だとしても、1.5GB 喰い尽くしてもおかしくないかなぁとは思います。 うーんやはりそうですか。 データの持ち方の影響も大きいとは思いますが、ハッシュは内部で キーのインデックスを作っているために、キー全体のデータよりも 相当数のメモリを食うのかな?となんとなく考えていましたが、 まさかこれほどとは思いませんでした。 > 1. データが固定長 (もしくは最大長が決まっている) > 2. CSV の項目名や項目長が変わる可能性は少ない > 3. 処理内容が変わる可能性が少しでもある > (この条件に引っかかるレコードは除外する、とか) >であれば、DB に突っ込んだ方がよろしいのではないでしょうか。 2と3は該当するので、DBに変換して処理する方向でやってみます。 ただ、元の入力ソースの総合計が2.6Gbも有るので、DB化する事に かかる時間やファイル占有量がわからなくてその選択肢を選びま せんでした。 全て書き直しになりそうだ・・・汗 |
|
突然のメールですみません。 岩崎と申します。 実は、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まで情報を転送 いただければ幸甚です。、 |
|
ご存知の方がいらっしゃれば、教えてください。 UNIXサーバで、あるファイルがなくなりました。 いつ、どのように消えてしまったかを知る術はあるのでしょうか? 領域不足で、優先度が低く削除されたとか、 誰かがrmコマンドを実行したとか…。 教えてください。 |
|
>>3322 岩崎 Mew のことは http://www.mew.org で質問した方が早く解決すると思います。 >>3323 pyontan > いつ、どのように消えてしまったかを知る術はあるのでしょうか? 残念ながら、よっぽど特別な仕掛けでも仕込んでおかない限り 無理だと思います。 > 領域不足で、優先度が低く削除されたとか、 さすがにこれはないでしょう。ちなみに UNIX では、ファイルに 優先度という概念はないです。 > 誰かがrmコマンドを実行したとか…。 というようなログも、一般的な UNIX では用意されていないです。 |