카테고리

분류 전체보기 (510)
문학 (128)
찬양 콘티(Continuity) (80)
Business as heritage (6)
IT . Web (149)
Photo (127)
etc. (20)
Total342,523
Today72
Yesterday69
*20121219 국치가 회복될 사건이 올 때까지 블로그 양쪽은 조의를 표하는 검정색입니다.
Tistory 로고 이미지 티스토리 가입하기!









블로그 이미지

.NET 문자열 처리 시, 문자열의 연결이 길어질 것 같으면 String의 연결보다는 StringBuilder가 유리할 때가 있습니다.

그런데 간혹 내용이 길 경우 아래 에러메시지를 만날 수 있습니다.

Insufficient memory to continue the execution of the program.
...
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
...

실제로 시스템에 충분한 메모리가 없어서 발생할 수도 있지만 근본적인 원인은 StringBuilder의 기본 크기가 16Byte라는 점에 있을 수 있습니다.

사실 별로 메모리를 많이 차지하는 작업이 아님에도 불구하고, 최종확장 크기가 2MB 정도 된다면 자동확장 시 2배 확장을 반복하는 StringBuilder는 순간적으로 가비지 컬렉션이 처리하기 전에 엄청난 수의 StringBuilder를 양산하게 됩니다.(확장시에는 String처럼 새로 생성하므로)

그러므로 평균 8KByte의 문자열이 출력된다면, 처음부터 StringBuilder sb = new StringBuilder(); 보다는 StringBuilder sb = new StringBuilder(1024 * 8); 이 메모리 사용량과 속도 모두에서 유리할 수 있습니다.

그리고 결정적으로 사용자는 최종적으로 좀 빨리 결과가 화면에 보이던 조금 느리던 간에 Exception이 뜨는 것은 정말 최악으로 여기거든요. 엔지니어 입장에서도 마음 저리구요.ㅠㅜ

아무튼 Insufficient memory to continue the execution... 이 자꾸 발생한다면 단지 최종 문자열이 커서 메모리가 부족하다기 보다는 순간적으로 뿜어져나오는 다수의 StringBuilder의 총합 크기가 커서라고 보실 수도 있습니다.


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by One of Remnants

댓글을 달아 주세요

달력

« » 2017.06
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

최근에 받은 트랙백

글 보관함

티스토리 툴바