1

Web サービスからファイルをダウンロードするアプリを作成しています。

ファイルのダウンロード方法は次のとおりです。

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

FileDescriptor のリストを保存するために使用したコレクションは、LinkedList です。ただし、ファイルのグループごとに、新しい LinkedList を作成して FileDescriptor を保持します。擬似コードは次のようなものです。

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 (およびその要素) がガベージになります。これは何か良いことですか?このシナリオでそれを処理するためのより良い方法があると確信しています。

ご意見をお聞かせください。

どうもありがとう。

4

1 に答える 1

5

1000 個の LinkedList オブジェクトを作成する (およびそれらをガベージ コレクションする) コストは、何百万ものファイルをダウンロードするコストに比べてごくわずかです。ここでは、1 ミリ秒対時間について話しています。数メートル対地球から月までの距離。

事前最適化を行っています。通常、事前最適化の場合と同様に、間違った場所で実行しています。

つまり、リストは動的にサイズ変更されるデータ構造であり、再利用するために最大サイズを知る必要はありません。それは動的に成長します:

List<FileDescriptor> list = new LinkedList<FileDescriptor>();
do {
    list.clear(); // remove everything from the list
    ...
}
while (...);
于 2012-04-21T10:46:18.190 に答える