마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android 에서 string outofmemory 문제 해결좀 부탁드립니다. ㅠㅠ

0 추천
File file = new File(Environment.getExternalStorageDirectory()
     + "/TEST/" + FILE_NAME);
   FileInputStream fis = new FileInputStream(file);
   InputStreamReader isr = new InputStreamReader(fis);
   BufferedReader br = new BufferedReader(isr);
   line = br.readLine();
   while ((line = br.readLine()) != null) {
    sb.append(line.trim() + " ");
   }
   br.close();
   isr.close();
   fis.close();
   xml2 = sb.toString();

이런 식으로 해놓았습니다.

파일을 메모리카드에서 읽어서 string 타입인 xml2에 넣는 방식인데요.

용량이 작은 1MB정도의 파일은 잘 읽어집니다.

그런데 10MB 파일을 넣었더니 outofmemory 가 발생하네요..

아래는 에러 내용입니다.

----------------------------------------------------------------------------------------------------------------------------------------------------------

03-07 14:17:29.701: E/AndroidRuntime(27603): FATAL EXCEPTION: main
03-07 14:17:29.701: E/AndroidRuntime(27603): java.lang.OutOfMemoryError
03-07 14:17:29.701: E/AndroidRuntime(27603):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at java.lang.StringBuilder.append(StringBuilder.java:216)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at com.exam.v2test.MainActivity.kmltest(MainActivity.java:385)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at com.exam.v2test.MainActivity$1.handleMessage(MainActivity.java:524)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at android.os.Looper.loop(Looper.java:137)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at android.app.ActivityThread.main(ActivityThread.java:4921)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at java.lang.reflect.Method.invokeNative(Native Method)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at java.lang.reflect.Method.invoke(Method.java:511)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
03-07 14:17:29.701: E/AndroidRuntime(27603):  at dalvik.system.NativeStart.main(Native Method)
----------------------------------------------------------------------------------------------------------------------------------------------------------

아이구.. String 타입에 너무 큰 값을 넣어서 그럴까요...?

파일 용량을 줄일수도 없구.. 이걸 어째야 할까요 ㅠㅠ
시험모드 (970 포인트) 님이 2013년 3월 7일 질문

2개의 답변

0 추천
 
채택된 답변

완변학 해결법은 아니지만.. 

 

 <application
        android:icon="@drawable/icon"
        android:label="Slim Vit"
        android:largeHeap="true"
        android:theme="@android:style/Theme.NoTitleBar" >
        <activity
            android:name=".IntroActivity"
            android:label="ㅇㅇㅇ" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        
        </activity>
 
좀완화 되실거에여 넣어보세여 메니페스트에 넣어보세여
 
그리고 아래의 유알엘 참조해보세여
 
파일이 용량이 클경우 분할해서 하라는 내용인것 같습니다. 
웅바라지 (4,780 포인트) 님이 2013년 3월 7일 답변
시험모드님이 2013년 3월 7일 채택됨
오.. 진짜 해결됐어요 ㅎㅎ
감사합니닷!
근데 다른 에러가 발생한다는 ㄷㄷ...
흠.... 저 옵션은 허니컴 이상에서만 먹히는.... 아래 버전은 목통입니다...
허니콤 이상 빌드를 하실게 아니라면 해결책이 될수가 없는.....^^
지금 제가 사용하는 API가.. 4.0 이상 부터 지원되는거라서..
아마 싹 뜯지 않는이상 4.0 아래로는 안 내려갈것 같네요 ㅎㅎ;;
감사합니다.
0 추천

제가보기에는 

 

핵심적인 부분은 line.trim() + " " 이게 문제가 아닐가합니다

 

아래에다가 append로 붙여보세요

건방진프로그래머 (26,630 포인트) 님이 2013년 3월 9일 답변
근본적인 원인은 이게 맞는 것 같습니다.

기껏 StringBuilder 를 사용하시면서 (+)연산자를 사용하시니
읽어들이는 파일 사이즈가 커짐에 따라
불필요한 String 객체 생성 및 복사가 많아지면서 OOM이 발생한 것 같아요.
...