- PR -

ファイルの中の文字列検索の速度向上

投稿者投稿内容
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-19 17:15
>未記入様
  サーブレットにして実行するということでしょうか?

>永井和彦
引用----------------------------------------------------------------------------
ソースをざらっと見ただけなんですが、このプログラムは読み込んだログ1行毎に1行を画面に出力する仕様になっているように見えます……。

--------------------------------------------------------------------------------
これに関しては一応、for文の後にif文をかませて条件がelseの場合には表示しないようにしています。

けれども、日付判定で2005年の全てとしてしまうとやはり全部のデータが表示される事になってしまいます。

また、表示件数がどうしても多くなってしまう場合などはどのようにしたらいいのでしょうか?
Bufferに一回いれてから表示しろよ って事なのでしょうか?
ちょっと、表示件数が多い場合の処理がわかりませんのでご指摘の程お願いいたします。
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-04-19 17:46
とりあえず、groupHTMLをStringBufferに変えてみてください。
Stringが長くなればなるほど、後ろに足す処理はバカみたいに時間を食うようになります。

StringBuffer groupHTML = new StringBuffer();
groupHTML.append(...);



<%=groupHTML.toString()%>

・元
groupHTML += s.substring(6, 8) + " / ";
・折角使っても中で足してたら駄目
groupHTML.append(s.substring(6, 8) + " / ");
・案1
groupHTML.append(s.substring(6, 8)).append(" / ");
・案2
groupHTML.append(s.substring(6, 8));
groupHTML.append(" / ");

#変にスマイリーが出たので修正

[ メッセージ編集済み 編集者: TomScissors 編集日時 2005-04-19 17:48 ]
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-19 17:52
>TomScissors様

ありがとうございます。
早速やってみたいと思います。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-04-19 18:01
引用:

StringBuffer groupHTML = new StringBuffer();
groupHTML.append(...);



<%=groupHTML.toString()%>



重箱のスミみたいですが……
「StringBuffer→String」の変換にはbuffer.toString()ではなく、new String(StringBuffer buffer)を使う方が良い……だったような記憶があります。
確か、toString()はデバッグ用という位置付けだったような気がします。
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-04-19 18:08
StringBufferに関しては、toString()で良いような気もするのですが。

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/StringBuffer.html

私の解釈が正しいのかも、
訳が正しいのかも分かりませんが^^;
・以下引用
=========================
文字列バッファをそのデータを表現する文字列に変換します。新しい String オブジェクトを割り当て、現在この文字列バッファが表す文字列を含むように初期化します。最後に、作成された String を返します。この操作のあとに文字列バッファを変更しても、String の内容には影響しません。
=========================
定義:
インタフェース CharSequence 内の toString
オーバーライド:
クラス Object 内の toString
戻り値:
文字列バッファの文字列表現
=========================
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-19 18:11
>TomScissors 様
>永井和彦 様

沢山のご指摘ありがとうございました^^
今、コードを打ち変え終わったところです。
現在では1790行のログでも1秒弱で表示されるようになりました。

今回は大変お世話になりました。
ありがとうございます。

あと、変換に関して下記の様な物を発見しました。
もしかしたらこれの事をいっていたのではないでしょうか?


StringBuffer buffer = new StringBuffer("あいう");
buffer.insert(1, "B");
buffer.insert(4, "C");
buffer.insert(0, "A");
String result = new String(buffer);

以上です、大変お世話になりました。
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-19 18:11
>TomScissors 様
>永井和彦 様

沢山のご指摘ありがとうございました^^
今、コードを打ち変え終わったところです。
現在では1790行のログでも1秒弱で表示されるようになりました。

今回は大変お世話になりました。
ありがとうございます。

あと、変換に関して下記の様な物を発見しました。
もしかしたらこれの事をいっていたのではないでしょうか?


StringBuffer buffer = new StringBuffer("あいう");
buffer.insert(1, "B");
buffer.insert(4, "C");
buffer.insert(0, "A");
String result = new String(buffer);

以上です、大変お世話になりました。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-04-19 18:23
サーブレットで実行するのではなく、JSPに記述している処理をmainメソッドを持った
スタンドアロンのアプリケーションに移行して実行してみるということです。

つまり、kamiさんはファイルの処理速度が遅いことを問題としているので、
問題を切り分けるためには、以下のようになると思います。

1.コードの処理が遅い(目標値より遅い)かどうかをスタンドアロンのアプリケーションで確認
スタンドアロンで実行した結果、
2-a.コード自体に問題がある(目標値より遅い)場合→コードを修正
2-b.コード自体に問題がない(目標値を達成している)場合→システムリソースを増強した環境で(CPU,スワップに注意)、JSPで実行してみる

いずれにしても、StringはStringBufferに置換すべきですが。
また、チューニングする場合は、事前に目標値を定めておくべきです。
システム要件に処理性能が定義されているとは思いますが。

目標値がないと、延々とチューニングし続けるはめになってしまいますよ。

スキルアップ/キャリアアップ(JOB@IT)