RecordSetでの大量データ - Printable Version +- Curl Global Community (https://communities.curl.com) +-- Forum: Blogs (https://communities.curl.com/forumdisplay.php?fid=17) +--- Forum: Tech blog (https://communities.curl.com/forumdisplay.php?fid=18) +---- Forum: Baison log (https://communities.curl.com/forumdisplay.php?fid=27) +---- Thread: RecordSetでの大量データ (/showthread.php?tid=1189) |
RecordSetでの大量データ - umemura - 12-05-2014 ★point 大量データを扱うときは、RecordFieldの数に気をつけろ ビッグデータといわないまでも、数万件から数十万件のデータを、 Curlで扱いたいということが最近増えてきました。 私が大量データを扱う経験したのは、CSVで作成した元データを、サーバに送って取り込む機能。 通常業務では取り込む対象は数件とのことだったので、1万件程度の負荷テストだけで済ませていました。 しかし、1年に何回か、10万件のデータを取り込む、という運用があるとのことで、 最大データ容量での負荷テストを行ったとたん、メモリ不足でCurlが落ちてしまいました。 最終的には、ファイルを内部で分割しながらサーバとやり取りする仕組みに実装しなおしたことで 問題は解決しましたが、 メモリ消費量の推移がイマイチ納得いかなかったので、 サンプルを作ってテストしてみました。 その内容は以下。 ちなみに、メモリ消費量はタスクマネージャで確認した値です。 フィールド数 レコード件数/メモリ消費量 3万件 6万件 12万件 70 30MB 60MB 120MB 140 60MB 120MB 240MB 210 120MB 240MB 470MB 280 110MB 240MB 470MB 350 230MB 460MB 820MB 420 230MB 460MB 830MB 見てわかるとおり、レコード件数に対しては一定の比率ですが、 フィールド数に対しては、210個と280個、380個と420個の場合に同じメモリ消費量となり、 階段のようなグラフになっていることがわかります。 サンプルの中では、フィールドの物理名の長さを変えたり、 レコードの値設定を、通常の set ではなく、BasicRecord.internal-set-value に変えてみたりと いくつかのチェックをしましたが、どれも有意な差にはなりませんでした。 大量RecordSetを作る上での一番のポイントはフィールド数であり、 閾値の確認まではしていませんが、 メモリの領域が足りなくなった段階で、倍々で確保する仕組みになっているのかもしれません。 業務仕様上、フィールド数を単純に削減することはできないかもしれませんが、 大量データをRecordSetに取り込む場合は、 フィールド数を意識しておくとよいかもしれません。 |