Post Reply 
 
Thread Rating:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RecordSetでの大量データ
12-05-2014, 02:41 PM
Post: #1
RecordSetでの大量データ
★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に取り込む場合は、
フィールド数を意識しておくとよいかもしれません。
Find all posts by this user
Quote this message in a reply
Post Reply 

Forum Jump:


User(s) browsing this thread:
1 Guest(s)