2014-09-30 6 views
1

약 10^8 개의 파일이 들어있는 폴더에서 파일을 읽어야하는 프로그램을 디자인하고 있습니다.FileInputStream은 어떻게 파일을 찾습니까?

FileInputStream은 제공된 파일 이름에서 원하는 파일을 어떻게 찾을 수 있습니까? O (1) 조회 시간을 사용하는 hashmap과 비슷하게 작동합니까? 아니면 일치하는 항목이 발견 될 때까지 주어진 폴더의 파일을 선형 적으로 통과합니까?

Windows File Storage가 FileInputStream보다 작동하는 방식과 더 관련이 있다고 생각하지만 솔직히 확신 할 수 없습니다.

+0

이렇게하려면 'SimpleFileVisitor' 사용을 고려하십시오. [ref] (http://docs.oracle.com/javase/tutorial/essential/io/walk.html) – afzalex

+0

파일의 크기는 어느 정도입니까? NTFS에서 최소 할당 단위는 4096 바이트이므로 10^8 파일의 경우 평균 디스크 공간 오버 헤드는 약 200GB가됩니다. –

답변

3

파일을 찾도록 운영 체제에 요청합니다. 운영 체제는 어떻게합니까? OS 및 파일 시스템에 따라 다릅니다. 적어도 어떤 경우에는 대답이 "예, HashMap처럼 작동합니다"라고 대답합니다. 반면에 같은 디렉터리에 수천 개가 넘는 파일이 있으면 OS/파일 시스템 조합이 심각하게 느려지는 것을 알고 있습니다.

+0

운영체제별로 효율성 검색을 어디에서 찾을 수 있으며 문제가 발생하는 곳을 알 수 있습니다. – gravityplanx

+0

@gravityplanx, 그냥 테스트 할 수 없습니까? 다른 디렉토리로 가서'type '을 실행하십시오. 이것이 빠르면 자바도 그렇게 될 것입니다. – Ingo

+0

@Ingo 필자는 10GB 파일 구조를 아직 만들지 않았으며, 막 다른 길을 피하기를 원합니다. 그리고 그 크기의 폴더가 없으면 이것이 얼마나 효율적인지 알기가 어렵습니다. – gravityplanx

4

파일 이름이 OS에 전달되고 일치하는 이름을 찾는 디렉토리를 읽습니다. 조회를 최적화 할 수는 있지만 Java는 관련되지 않습니다.

파일을 여러 개의 디렉토리로 분할하고 파일을 적게 사용하는 것이 좋습니다. 많은 작은 파일을 열거 나 닫는 것이 대부분의 시간을 파일 기술자를 열거 나 닫는 데 씁니다. 찾기와 읽기는 일반적으로 훨씬 적습니다.

+0

추가 정보 : 저는 효과적으로 파일 이름을 키로 사용하고 파일을 객체로 직렬화하여 SuperHashMap으로 디렉토리를 사용하려고합니다. 이 SuperHashMap에 매우 적은 수의 읽기/쓰기가 필요하므로 많은 파일을 열거 나 닫는 문제가 없지만 데이터 관리 책임을 OS로 밀어 넣으면 좋겠다. 프로그램이 개별적으로 실행될 때 실제로 20GB 파일 만 액세스해야 할 때 10GB 개체가 될 수있는 프로그램을로드하지 않아도됩니다. 이 상황을 감안할 때 의견이 있으십니까? – gravityplanx

+0

@gravityplanx 내가 원하는만큼 효율적이지는 않지만 이것이 효과가있는 것으로 보입니다. 많은 파일을 갖는 것이 가장 단순합니다. 나는 처음 3-4 자의 각각을위한 디렉토리를 만드는 것을 고려할 것이다. 이렇게하면 프로그램 및이 디렉토리에서 사용하는 모든 도구의 성능이 향상 될 수 있습니다. –

관련 문제