2012-04-21 5 views
1

웹 서비스에서 파일을 다운로드하는 앱을 작성 중입니다.이 시나리오에서 자바 콜렉션 사용하기

다음과 같이 파일 설명 다운로드하는 방법을 방법 : 웹 서비스에서

  1. , 파일의 목록을 다운로드합니다. 파일 수가 너무 큰 경우 첫 번째 파일 그룹을 다운로드하십시오. 각 그룹의 최대 수는 알 수 없습니다. 다운로드 된 파일은 시스템 임시 디렉토리에 저장됩니다.
  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가 더 이상 필요하지 않습니다. 각 그룹에 포함 할 수있는 최대 수를 알 수 없기 때문에 하나의 목록을 만들고 다시 사용할 수는 없습니다.

이와 같은 코드를 사용하고 수백만 개의 파일이있는 경우 각 그룹은 최대 1000 개의 파일 만 가질 수 있습니다. 결국 많은 LinkedList (및 해당 요소)가 Garbage로 끝납니다. 이게 뭔가 좋은 일이야? 이 시나리오에서는 더 나은 방법이있을 것이라고 확신합니다.

의견을 말하십시오.

감사합니다.

+0

이 목록에서 수행 할 연산은 무엇입니까? 대부분의 경우'ArrayList'가 훨씬 더 효율적입니다. 왜 정확히 재사용 할 수 없습니까? 대부분의 콜렉션은 요소를 추가 할 때 동적으로 커집니다. –

답변

5

1000 개의 LinkedList 개체를 생성하고 가비지 수집하는 것은 수백만 개의 파일을 다운로드하는 것보다 비용이 거의 들지 않습니다. 시간당 1 밀리 초를 말하는 것입니다. 지구에서 달까지의 거리를 나타내는 일부 미터입니다.

사전 최적화가 이루어지고 있으며, 일반적으로 사전 최적화 할 때 잘못된 위치에서 수행하고 있습니다.

즉, 목록은 동적으로 크기가 조정 된 데이터 구조이며이를 재사용 할 수 있도록 최대 크기를 알 필요가 없습니다. 동적으로 커질 것입니다 :

List<FileDescriptor> list = new LinkedList<FileDescriptor>(); 
do { 
    list.clear(); // remove everything from the list 
    ... 
} 
while (...); 
관련 문제