2014-02-09 1 views
3

나는 빠른 읽기 txt 파일을 ArrayList에 문제가 있습니다. 파일 크기를 0,9MB로 읽으려면 5 분을 기다려야합니다. 파일 크기가 34MB이면 (안드로이드가 1MB보다 큰 파일을 허용하지 않기 때문에 부분적입니다.) 완전히 작동하지 않습니다. 프로세스가 최대 몇 초가되어야한다고 생각합니다.어떻게 빨리 안드로이드에 ArrayList에 텍스트 파일을 읽을 수

String word; 
public ArrayList<String> dictionary = new ArrayList<String>(); 

public void setup() 
{ 

    try { 
     AssetManager assetManager = getAssets(); 
     InputStream inputf; 
     inputf = assetManager.open("dict_1.txt"); 
     reader = new BufferedReader(new InputStreamReader(inputf)); 

     word = " ";  
     while(word != null) 
     { 
     word = reader.readLine(); 

     if (word != null) 
      dictionary.add(word); 
     } 
     if(reader.equals("null")) println("No file found"); 

    } catch (NullPointerException e) { 
    e.printStackTrace(); 
    println("No file found"); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
} 

내 영어에 대한 미안 해요 :

는 코드입니다. 나는 모두가 understadable이기를 바랍니다.

+0

시작 효율성 o(1)을 제공 .IT 대신 arraylistlinkedlist를 사용해야합니다 잖습니까. – CommonsWare

+0

'reader'는 "null"과 같을 수없고 NullPointerException은 본질적으로 '파일을 찾을 수 없음'을 의미하지 않습니다. 이상한 오류 및 예외 처리 문제를 수정하는 것이 좋습니다. – EJP

+0

예외 처리 문제를 해결했지만 너무 느리지 만 파일을 완전히 읽으면 중요하지 않습니다. – TheDealer105

답변

2

ArrayList은 아이템을 추가 할 때 계속 재 할당됩니다. 이것은 포인터의 무리가 메모리에 복사해야하기 때문에 특히 목록이 커질수록 CPU 시간이 중요하지 않습니다. 미리 할당 더 좋은 방법은 사전 파일의 첫 번째 항목으로 항목 수를 저장하고하는 것 ArrayList :

dictionary = new ArrayList<String>(numberOfEntries); 

더 고급 최적화에 의존하지 않는 데이터 구조 일 것 자바 컬렉션 클래스. 필요에 따라, 이것은 하나의 급습에서 메모리로 읽히는 거대한 UTF-8 바이트 배열 일 수 있습니다 (심지어 메모리 맵 파일을 통해 액세스 할 수도 있습니다).

+0

"한 번에 메모리로 읽어들이거나 메모리 맵 파일을 통해 액세스 할 수있는 거대한 UTF-8 바이트 배열 일 수 있습니다."- 어떻게 사용합니까? – TheDealer105

1

귀하의 문제가 In arraylist이 작업이 일정 시간은 읽기 위해 ArrayList 단어를 추가하고있다 - O를 (1)하지만 write의 조작 backing array, re-allocation에 공간이 부족할 수있는 잠재력 및 copy이 - 즉 N (O에서 실행되도록) 당신이 당신의 시간이 소요되는 위치를 확인 Traceview를 사용하여) 추가하기위한 (

LinkedList<String> dictionary = new LinkedList<String>(); 
+0

+1 그러나, OP는 목록 항목에 대한 일종의 임의 액세스를 원할 것이라고 가정합니다. 이러한 읽기 작업은 매우 느릴 것입니다 - O (n) slow. –

+0

불행히도 두 방법 모두 동일한 결과를 제공합니다. Pre-allocate ArrayList 및 LinkedList로 변경하고 아무런 변화가 없습니다. 읽기 시간은 여전히 ​​길다. – TheDealer105

관련 문제