카테고리

분류 전체보기 (510)
문학 (128)
찬양 콘티(Continuity) (80)
Business as heritage (6)
IT . Web (149)
Photo (127)
etc. (20)
Total357,714
Today33
Yesterday98
*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의 총합 크기가 커서라고 보실 수도 있습니다.


저작자 표시
신고
Posted by One of Remnants

댓글을 달아 주세요

달력

« » 2017.10
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 31        

최근에 받은 트랙백

글 보관함