- PR -

ArrayListで大量のデータを追加する際の速度

1
投稿者投稿内容
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2006-06-20 09:17
初めて書き込みさせていただきます。

現在VB.Net2003にてArrayListに大量のデータ(1万件程度)を
登録する処理を行っています。

今はAddItemにて1件づつ登録しているのですが、
結構時間がかかってしまいます。

ComboBoxのようにAPIを使って速度を上げることなどは
不可能なのでしょうか?

よろしくお願いします。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-20 09:39
引用:

KT工房さんの書き込み (2006-06-20 09:17) より:
初めて書き込みさせていただきます。

現在VB.Net2003にてArrayListに大量のデータ(1万件程度)を
登録する処理を行っています。

今はAddItemにて1件づつ登録しているのですが、
結構時間がかかってしまいます。

ComboBoxのようにAPIを使って速度を上げることなどは
不可能なのでしょうか?

よろしくお願いします。



はじめまして、深山です。

的外れな回答かもしれませんが、Capacityプロパティを設定してみてはどうでしょう?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-20 10:04
引用:

KT工房さんの書き込み (2006-06-20 09:17) より:

今はAddItemにて1件づつ登録しているのですが、
結構時間がかかってしまいます。


追加するアイテムにもよるのですが...
Add メソッドよりは AddRange メソッドでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2006-06-20 11:28
早速の返答ありがとうございます。
思ったよりもレスポンスが早いので感動しています。

Capacityプロパティを使用するとリストの再割り当てが
必要なくなるため高速化できるということですね。
しかし、あらかじめ件数がわかっていれば良いのですが、
件数が確定されているわけではないのでツライですね。

AddRangeメソッドも調べてみましたが、
1件づつデータをチェックしながら必要なものだけを
登録しているため、まとめて登録も使えないかと思います。

1件づつAddするよりも動的配列に一度格納してから、
AddRangeを使用したほうが早いんでしょうかね?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-06-20 11:49
引用:

1件づつAddするよりも動的配列に一度格納してから、
AddRangeを使用したほうが早いんでしょうかね?



10件づつくらい、まとめて追加するようにすると少し早くなるかな?

やはり、ある程度追加数の予測がたつなら、最初に ArrayList のコンストラクタでヒントを与えておくのがイチバンかと。

専用のコレクション作った方がいい場合もあるかも。



[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-06-20 11:54 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-06-20 12:20
コード:
しかし、あらかじめ件数がわかっていれば良いのですが、 
件数が確定されているわけではないのでツライですね。


「1万件程度」というのが分かっているなら、1万500ぐらいとかでも良いでしょう。
確か ArrayList はキャパが足りなくなった時点で、キャパを倍にしていくんじゃなかったかな。
16->32->64…
_________________
囚人のジレンマな日々
KT工房
常連さん
会議室デビュー日: 2006/06/20
投稿数: 49
投稿日時: 2006-06-20 16:29
自己レスです。

どうやらArrayListの問題ではなく、追加時にデータを加工している箇所が
遅い要因であることが判明しました。

問題になっていたのが、ArrayListを含めているコンポーネントで次のような流れです。
@AddItemメソッド → Aデータ加工 → BArrayListに登録

どうもAのデータ加工のところで重労働を行っているようです。
実際Aをコメントアウトしてみたところ、900ミリ秒から15ミリ秒に変わりました。
中で何をしているのかはまだ見ていませんが、間違いなさそうです・・・。

今回初めてIT会議室を利用させていただきましたが、
なかなか的確なアドバイスが貰えて勉強になりました。
今後とも利用させていただきますので、その際は皆さんよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)