人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlで「約3,000個の連続番号にそれぞれ文字列を割り当てて(1-3番まではhoge、4-5番まではfuga、6-10番まではfugo...のように)、番号を指定したときに対応する文字列を取り出す」ということを実現させたいです。
(例)
$number_string->ref(1) # hoge
$number_string->ref(8) # fugo

DBに3000組を連番で突っ込む、という方法は思いつきますが、ちょっとした文字列を取り出すのにいちいちDBにアクセスするのは処理が遅くなりそうなので避けたいです。
なにか良い方法はないでしょうか。ご教授願いたいです。

●質問者: Cside
●カテゴリ:コンピュータ インターネット
✍キーワード:dB hoge Perl アクセス 対応
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●35ポイント ベストアンサー

常駐プログラムでメモリも十分になる場合は、短い文字列3000個程度であれば単純に配列に突っ込んでおくとかでいい気がします。

@number_string=(
 "zero", #0
 "hoge","hoge","hoge", #1-3
 "fuga","fuga","fuga", #4-6
 "fugo","fugo","fugo","fugo", #6-10
);

$number_string[1] # hoge
$number_string[8] # fugo

実際はソースにデータテーブルを全部書くのではなく、最初に一度だけファイルを配列に読み出す処理を行うとかで良いと思いますが。

◎質問者からの返答

ありがとうございます。

メモリの負担にならないかがちょっと心配ですが

(3000個の文字列(1個あたり20文字ほど)がメモリにどの程度の負担になるのかは勉強不足で分からないのですが)、

最も簡単かつ確実な方法ですね。


2 ● imo758
●35ポイント

少し大変になりますがStorableモジュールを使うと微かに早くできるかもしれません。

予めStorableでデータを固めておきます。

use Storable qw(nstore_fd fd_retrieve);

@num_str=(
 "zero", #0
 "hoge","hoge","hoge", #1-3
 "fuga","fuga","fuga", #4-6
 "fugo","fugo","fugo","fugo", #6-10
);
 $fn='num_str.dat';
 open G, ">$fn" or die "cannot open $fn";
 nstore_fd \@num_str, \*G;

このスクリプトは少々時間がかかってもOKです。

普段頻繁に使うスクリプトでは、Storableで保存したデータファイルを読み込みます。

use Storable qw(nstore_fd fd_retrieve);

 $fn='num_str.dat';
 open G, "<$fn" or die "cannot open $fn";
 $num_str = fd_retrieve(\*G);
# @num_str = @{fd_retrieve(\*G)};
 print @{$num_str};
# print @num_str;

ただしStorableモジュールによるオーバーヘッドがありますので、巨大なデータでないとかえって遅くなってしまいます。それになにより下準備が面倒です。

他にも、データを100個くらいに区切って別個のファイルに格納し必要なファイルだけ読み込む、データファイルをRAMディスクに置く、配列にデータを格納したままプロセスを休止させプロセス間通信を使う、などの様々な方法が思い浮かびますが、3000個程度のデータだと、実際に試してみないとどれが一番効果的かはわかりません。

身も蓋もないことを言ってしまうと、そのくらいの処理ならば気にしないのが一番の解決法かもしれません。

◎質問者からの返答

おお、こんなモジュールがあるのですね。

今回の3,000個のデータは配列等で処理した方が良いみたいですが、

万単位のデータを扱うときにはとても便利そうですね。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ