■47199 / ) |
Re[13]: CSVファイル入出力時の速度向上方法について |
□投稿者/ れい (880回)-(2010/02/21(Sun) 03:12:00)
|
■No47179 (なちゃ さん) に返信
なちゃさんが何を言っているのかよくわかりません。
> こういうベンチって正確に実行するのはそれなりに難しいですよ。
ええ。 それは皆さん当然知っていると思いますよ。 だからこそMSも風評被害を防ぐため、「完全に再現する情報」がなければ公開するな、といっているわけで。
> ※例えば、レコード単位で読み書きと、1MB単位で読み書きの速度を計測した時、双方読み込みファイルのキャッシュは消えた状態で実行しているか? >略 > 当然、本当のレコード単位や1MB単位(本当のHDDアクセス単位はまた違いますが)でのランダム読み書きとは全くパフォーマンスが違ってきます。
本当のレコード単位や1MB単位のアクセスの時間が知りたいわけではありません。 「アルゴリズムを変える」ことで「実際に使う際の速度を早くする」と言うお題に対して、 ベンチマークで知見が得られればいいわけです。
「実際に使う際」の状況は質問者からは殆どなにも示されていないので、「普通」や「常識的状況」を想定するしかありません。 ならば「適当にキャッシュに載った状態」で測るのが妥当です。
で、実際にどのくらいキャッシュに載っているのかは幅があり、ベンチの時にも幅があります。 他にもさまざまな要因で幅が出て、その幅に応じて測定結果の誤差がきまります。 実際にはその誤差は測定できないので「見積もる」しかないですが。 アルゴリズム間の差が、見積もられた誤差よりも大きければお題に対して有効な解決案であると言えます。
その「見積もられた誤差」が妥当かどうかは重要ですが、 ベンチマークが正確かどうかはどうでもいいことです。
なので、みきぬさんもこあらさんも、見積もりが正しいかどうかを話題にしています。 みきぬさんはADODB.Streamを使うやり方では「関係ない」=「系統誤差が大きすぎる」と疑問を呈し、 こあらさんは「大差ないんじゃない?」と誤差が小さいだろうと述べているわけです。
> あと、1MBサイズとかでファイルに書き込むと、ライトスルーな動作になって(遅延書き込みが無効になって)、読み込みと交互に実行すると余計パフォーマンスが悪くなる気もします。 > ※1MBを一気にFileStreamに書き出さずに、遅延書き込みが有効になるくらいのもう少し小さいサイズで繰り返して書き込めばこれは防げると思いますが。 > > 逆にレコード単位だと、デフォルトでは4Kか8Kか単位でファイル書き込みになり、このサイズだと遅延書き込みが効くので、読み込みと交互だとパフォーマンスが上がったりという可能性もある気がします。 > ※こっちはFileStreamのバッファサイズを遅延書き込みできる範囲内で大きくするともう少し効率よくなりそうです。
そういった場合があるかもしれませんが。 よほど特殊なケースでないかぎり、それを考えて作るのは間違いであろうと思います。
まとめて書き込んで遅延書き込みが無効になって遅くなる、というような問題は OSなりドライバなりが対応すべき事柄でしょう。
それを考えなければパフォーマンスが足りないような状況なら、 そもそもプラットフォームの選定を間違えています。
#バッファのサイズはどのくらいが適切か、という話ならいろいろ考慮すべき点はあり、話題は尽きないでしょうが。
■No47075 (こあら さん) に返信 > ■No47047 (みきぬ さん) に返信 >>■No47041 (こあら さん) に返信 >>ただ今回の話では、元質問者から具体的なコードが提示されています。 >>わざわざ別のやり方で結果を示す理由がわからなかったのです。 >># VB6 の確認環境がないから、とかならわかるんだけど >> >>さらに言うと、私から見たこあらさんのやりかたは、元質問者の方法を「わざわざ遅くしている」ようにも見えました。 >>こあらさんのやり方で雲泥の差が出ても、それが元質問者の方法でもそのような結果になるかというと、関係がないと思うのです。 >># ADODB.Stream を知らない(CSV ファイルを DB のように扱ってるのかなあ、くらいの理解)し、 >># 確認できる環境も持ってないので、このへんは単なる勘ですが > > > 疑問が分かりました。こちらの状況を説明すると、 > ・VB6の環境がない > ・VBScriptならADODB.Streamのファイルコピースクリプトを持っていた > ・ADODB.StreamもFileSystemObject.TextStreamもMemoryStreamだから似たような性能でしょ? > ・ActiveXならVB6からでもVBScriptからでも呼び出しコストは大差ないんじゃない? > です。
私も最初はこあらさんのスクリプトでも十分実証になる=系統誤差が十分小さいと思ったのですが、 いまはそうは思っていません。
.Netでやってみたベンチだと、HDD以外の部分でもかなり時間を消費しているようでした。
「何も考えずに組んでも9割がHDDアクセスだ」というような状況ならActiveXでもVB6でもVBScriptでも、 その呼び出し法がなんであってもいいでしょうが、 メモリ内の処理でかなりの時間を食っていたわけで、話が変わります。
ADODB.StreamとFileSystemObject.TextStreamではずいぶん違ってもおかしくありません。 ADODB.Streamの中身は知りませんが、もしかすると最初に全読みするStreamかもしれませんし。 ずいぶん違う可能性があるので、あまり「関係ない」ということですね。
|
|