2012-04-21 1 views
1

Webサービスからファイルをダウンロードするアプリケーションを作成しています。このシナリオでJavaコレクションを使用する

次のように記述されているか、ファイルがダウンロードされる方法:

  1. Webサービスから、ファイルのリストをダウンロードしてください。ファイル数が大きすぎる場合は、最初のファイルグループをダウンロードしてください。各グループの最大数は不明です。ダウンロードしたファイルはシステムの一時ディレクトリに保存されます。
  2. ファイルごとに、ファイルfilenameとシステムの一時フォルダ内の一時ファイル名とその他の属性を含むFileDescriptor(カスタム)クラスを作成します.b FileDescriptorはリストに保存されます。
  3. ここでビジネスロジックを実行します。
  4. ファイルがあれば、次のグループをダウンロードします。

FileDescriptorのリストを保存するために使用したコレクションはLinkedListです。しかし、ファイルのグループごとに、新しいFileDescriptorsを保持するLinkedListを作成します。 Psudocodeのようなものです:ファイルの新しいグループが取得されるたび、ように見えることができたよう

do { 
    List<FileDescriptor> list = new LinkedList<FileDescriptor>(); 
    GroupOfFiles group = webService.getGroupOfFiles(); 
    Iterator<File> itr = group.iterator(); 
    while(itr.hasNext) { 
     list.add(new(FileDescriptor(itr.next())); 
    } 

    <My Business Logic here> 

} while(group.hasMoreGroups()); 

、私は新しいのLinkedListを作成するつもりです。ファイルのグループが処理された後、LinkedListは必要なくなります。 1つのリストを作成して再利用することはできません。なぜなら、各グループに含めることができる最大数は不明であるからです。

このようなコードを使用していて、何百万ものファイルがある場合、各グループは最大1000個のファイルしか持てません。たとえば、多くのLinkedList(およびその要素)がGarbageとして終了します。これはいいことですか?このシナリオでは、より良い対処法があると確信しています。

ご意見ください。

多くのありがとうございます。

+0

このリストにはどのような操作が行われますか?ほとんどの場合、 'ArrayList'ははるかに効率的です。なぜそれを再利用できないのですか?ほとんどのコレクションは、要素を追加すると動的に成長します。 –

答えて

5

1000個のLinkedListオブジェクトを作成(ガベージコレクション)すると、何百万ものファイルをダウンロードする場合に比べてコストが無視できます。ここでは1時間あたりの時間は1ミリ秒です。地球から月までの距離に対するいくつかのメートル。

事前に最適化していますが、通常はあらかじめ最適化している場合のように、間違った場所で実行しています。

つまり、リストは動的サイズのデータ​​構造であり、リストを再利用できるように最大サイズを知る必要はありません。動的に成長します:

List<FileDescriptor> list = new LinkedList<FileDescriptor>(); 
do { 
    list.clear(); // remove everything from the list 
    ... 
} 
while (...); 
関連する問題