- - PR -
可変長csvファイルの読み取りを3秒以内に
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-26 22:47
テキストボックスに行番号を入力して実行すると、csvファイルから、
指定番号のレコードを検索して1枚ずつ印刷するというものです。 印刷自体は3秒以内で出力出来るのですが、例えば、30万件目を 1枚出そうとすると、ループで40秒かかってしまう! (連番出力の場合2件目以降は早いのですが。。。) これをスペックの低めのパソコンで出力すると一体何秒かかることやら... 30万件目でも3秒以内に検索することは可能ですか? <言語>VB2005 <ファイル> ・ダブルクォーテーション付き カンマ区切り csvファイル ・レコード内容:連番,漢字氏名,カナ氏名,漢字住所,・・・ ・フィールド数は、全部で31項目で固定。 ・氏名や住所が可変長で、1レコードは最大450バイトです。 ・レコード数:10万件〜30万件 <コード概略> (Button1_Click) Dim Parser As New FileIO.TextFieldParser("ファイルパス") PrintData = Parser.TextFieldParser (PrintDcument1.PrintPage) While Not Parser.EndOfData If PrintData(0) = 開始番号 then Exit While PrintData = Parser.TextFieldParser End while 〜印刷処理〜 <パソコン>ノートパソコン PentiumM1.7GHz 512MB | ||||
|
投稿日時: 2007-06-26 23:03
DBMSを使いましょう。
3秒どころか一瞬で検索できます。 | ||||
|
投稿日時: 2007-06-26 23:42
あとは自力でINDEXを作成するとか、
考えられますが、一番簡単なのはDBを使うことです。 | ||||
|
投稿日時: 2007-06-26 23:52
秒なんて基準は性能に左右される要件なので、
もっと違う基準を用意しましょうよ。 CSVというデータ形式である限り、 上から順に読むしかないので、厳しいのでは? 例えば連続的に処理されるのであれば、 起動時にインデックスの作成など、データの最適化を行う事によって高速化が可能です。 これらの処理はあしゅさんも仰る、DBMSが勝手にやっている事です。 私もあしゅさんと同じく、DBMSを使いましょうという意見です。 | ||||
|
投稿日時: 2007-06-27 01:00
あまっているメインメモリの一部を使ってRAMディスクを作成し
そこにCSVファイルを配置してみては? VBのロジックを一切変更せずに劇的に高速化できるかも知れません。 ただし『スペックの低めのパソコン』ではメモリはあまっていないかも知れませんが… | ||||
|
投稿日時: 2007-06-27 09:24
物理的な行番号とファイルの1フィールド目の行番号は一致してますか?
一致しているのなら、「行番号を入力して(検索を)実行」する要件をクリアするためにはパースしながら読み込む必要はないですよね? 最終的には「30万件目でも3秒以内に検索することは可能ですか?」は「130MBのファイルは3秒以内に全部読めますか?」という質問と同じでしょう。 アプリケーションが130MBのメモリを獲得でき、1度起動したら他のアプリケーションがデータを更新することは無くて、検索を繰り返すだけなら自前でキャッシュしてしまうのが効率がいいでしょう。キャッシュの中を線形探索しちゃダメですよ。 | ||||
|
投稿日時: 2007-06-27 14:32
皆さん有り難うございます。
社内で使うだけであれば、30万件(130MB)を配列変数に格納して、 読み込みこんで出力するのも手ですよね。 (その際,順読みする気でした!二分探索等の方法を取ります) ただ、少し汎用性を持たせたいという思いがあり、50万件目でも 速く出力できたり、連番以外でも参照できたりを考えていました。 そこで、敷居が高いと感じていたDBにトライしたいと思います。 DBMSは、VB2005EE+SQLServerEEの組み合わせで、テストして みようかと思うのですが、何かアドバイスありますか? | ||||
|
投稿日時: 2007-06-27 15:01
れっつ・ちゃれんじ。 まずはやってみるのが一番だと思います。 |