none
データファイルに最も高速にアクセスするには? RRS feed

  • 質問

  • 現在、株価データ(1行10項目程度の数値データで、2500行程度)をCSV形式にて
    保存しておりますが、下記環境で約3800銘柄程度の読込みに3~4分もかかって
    しまいます。
    ちなみに読込みは、My.Computer.Filesystem.ReadAllTextを使用し、正規表現で
    各行ごとのデータをさばいています。


    ■環境
    ・Pentium4 3.4GHz
    ・Memory 2G
    ・HDD SATA 7500rpm (SEAGATE Baracuda)
    です。

    ここからが質問なのですが、
    できればCSVファイルとはいかなくともテキストでデータを高速に読み書きしたい
     (データの確認ができるため)のですが、そのようなやり方は存在しますか?

    ■.NETではランダムアクセスが構造体とセットなので、銘柄毎にデータ全体を構造体
     へ読み込む場合は、
    ランダムアクセスファイルの方が速いのかどうか教えてください。

    ■上記以外にバイナリファイル(アクセス?)の方が速い場合は、パフォーマンス向上
     の具体的な目安(例○○%速度向上など、別の事例でも構いません)と、
     
    簡単なコーディングの例を教えていただけないでしょうか。

    ■またさらに、SQL等のDBを使った場合は、今回のケースでどれほど速度差が出る
     のか教えてください。過去に、ExcelVBAにてADO経由でAccessへの読み書きと
     CSVデータへの読み書きで有意な差がでなかったため、素人考えで恐縮ですが
     DBにあまり期待をしていません。

    ■あ、それからXmlについてはシリアライズとかいうやつで似たようなデータを作成して
     試してみましたが、CSVの方が全然速かったので断念しました。これについても
     使い方によって速くなるならば、その方法を教えていただけないでしょうか。

    以上長くなりましたが、よろしくお願いします。

    2006年11月3日 13:21

すべての返信

  • こんにちは、なっぷさん。

     なっぷ さんからの引用
    できればCSVファイルとはいかなくともテキストでデータを高速に読み書きしたい
     (データの確認ができるため)のですが、そのようなやり方は存在しますか?

    データの確認ありきであれば、DBMS を使われた方が良いと思います。
    特定条件を抽出することに適しています。

    2006年11月3日 15:21
  •  なっぷ さんからの引用

    ■またさらに、SQL等のDBを使った場合は、今回のケースでどれほど速度差が出る
     のか教えてください。過去に、ExcelVBAにてADO経由でAccessへの読み書きと
     CSVデータへの読み書きで有意な差がでなかったため、素人考えで恐縮ですが
     DBにあまり期待をしていません。

    データベースは名前のとおりデータを扱うには、もってこいのシステムです。
    私は、SQL Server や Oracle などのデータベースを使用することをお勧めします。

    1銘柄2500 行でそれが3800銘柄。
    こんなに大量のデータを CSV で確認するのも大変ではないでしょうか。

    取得処理が遅かったのは、主キーやインデックスが取得条件に合っていなかったために遅かったのかもしれません。
    Excel に表示するのが遅かったかもしれませんし、
    Access から取得するのが遅かったかもしれません。
    実際にどの部分が遅いか検証されてみてはどうでしょうか。

     なっぷ さんからの引用

    ■あ、それからXmlについてはシリアライズとかいうやつで似たようなデータを作成して
     試してみましたが、CSVの方が全然速かったので断念しました。これについても
     使い方によって速くなるならば、その方法を教えていただけないでしょうか。

    Xml を解析する時間がかかるため、CSV より時間がかかるのでしょう。
    それでも .NET 1.1 より .NET 2.0 で大分速くなっています。
    それでも遅いと感じてしまうのであれば、Xml はやめたほうがいいでしょうね。

    2006年11月4日 3:45
  • じゃんぬさん、ダッチさん

    ご回答ありがとうございます。返信が遅れてすみません。
    DBとテキスト読込みで速度はどの程度違うか、教えていただけますでしょうか。

    よろしくお願いいたします。

    2006年11月6日 20:11
  • 実際にどのようなことがやりたくて、どこで時間がかかっているのでしょうか?

    一般的な株価情報(立会い日、4本値など)に関する約4000行のCSVを単純に読み込むだけなら、数秒(かからないかな?)で終わると思います。たぶん、そこからの正規処理などで時間がかかっているのではないでしょうか?

    データベースへ取り込むにしても、元のデータがCSVであれば、それを読んで取り込まなければなりません。テクニカル計算を行うのであれば、CSVで直接やるよりは、データベースに取り込み、ストアドプロシージャで行った方が、一般的に速いでしょう。

    2006年11月7日 1:49
    モデレータ
  • trapemiyaさん
    回答ありがとうございます。

    具体的にやりたいことは
    1996/09/30,566,567,565,565,89000
    1996/10/01,552,560,552,555,103000
    1996/10/02,556,560,552,560,148000
    1996/10/03,560,561,558,559,153000
    のようなデータ(日付、始値、高値、安値、終値)を、

    Structure myStock
        Dim DataDate as Date
        Dim Opne as Integer
        Dim High as Integer
        Dim Low as Integer
        Dim Close as Integer
    End Structure

    Public StockData as myStock

    という構造体への代入を、
    File.ReadAll
    正規表現でデータを抽出
    ③抽出データを構造体に代入
    2600行程度×3700銘柄程度に対して行いました。
    この場合、60秒程度かかります。
    (さらに調査したところ、①のみの場合は、7秒程度で
    終わりますので、②~③で非常に時間がかかっています)

    この②~③のプロセスを高速に代入する良い方法は
    ないでしょうか?
    (問題は、変数への値代入を含めたデータ読込みが
    高速にできないということだと考えています。)


    また、これをデータベースで処理すると
    数秒くらいかかりますか?
    ご教示ください。よろしくお願いします。

    2006年11月7日 9:58
  •  なっぷ さんからの引用

    また、これをデータベースで処理すると
    数秒くらいかかりますか?

    大量の同じCSVのデータを、アプリケーションを立ち上げる度に構造体に読み込むことは、非効率だと思います。
    多少時間はかかりますが、データベースに一度入れてしまって、そのデータをアプリケーションで活用する方法を考えた方が良いと思いますが、いかがでしょうか? もし、移動平均やボリンジャーバンドなどのテクニカルを計算されたいのであれば、データベースに入れても、いくらでも可能です。

    2006年11月7日 12:52
    モデレータ
  • 分析用の株価データに特定するなら、汎用DBを使うよりも自分で専用DBを設計したほうが目的を達成できると思います。

    この手の分析系システムを数年前まで長期間手がけたことがありますが、規則性のあるデータですし数値データのみですので、専用DBの設計もそれほど難しくありません。もちろん工夫の仕方でパフォーマンスや運用&保守性はいくらでも変わってしまいますが。

    私の場合、古くはMS-DOS時代に「ランダムアクセスファイル」で実現していました。
    当時は今のようにCPUもHDDも非常に低い能力でしたが、少なくとも実用に耐えるパフォーマンスは得ていました。

    DB設計に自信が無ければ汎用DBを使ったほうが簡単ですけど。

    2006年11月7日 15:46
  • ITSJP様

    ご教示ありがとうございます。
    専用DBとは、バイナリデータでデータを書き込み/読み出しを行うようなことを言っておられますか?

    簡単なコード例をご教示いただいてもいいでしょうか?
    よろしくお願いします。

    2006年11月7日 18:46