c# wpf adb logcat view 만들면서 생긴 문제

안녕하세요. 지금 C# NET core WPF로 툴을 만들고 있습니다.
현재 직면한 문제는 프로세스 메모리 문제가 발생했습니다.

System.Diagnostics.Process를 활용하여 adb command를 설정하여 logcat 정보를 읽어 오고
이 읽어온 message의 경우 textbox.append를 활용하여 textbox에 log를 출력하는 기능입니다.

문제는 log출력 시 시간이 지남에 따라 메모리가 기하급수적으로 사용되어 결국 UI가 느려지는 현상이 발생했고, 인터넷이나 여러 오픈소스를 찾아봐도 제가 원하는 해결책은 찾지 못했습니다…

혹시 관련된 내용으로 해결책을 찾아 보셨거나 해결하셨던 분이 있으시면 공유해주시면 감사하겠습니다 ㅠㅠ
또한, MVVM 패턴으로 멀티 thread시 많은 량의 데이터를 읽고 처리해야 하는 부분에 대해 고견있으시면 피드백 주시면 감사하겠습니다 ㅠㅠㅠ

4개의 좋아요

관련된 재현 가능한 코드를 깃허브를 통해 공유해주시면 같이 어떤 문제가 있는지 살펴보겠습니다.

4개의 좋아요

코드는 안봤지만, 대략적으로 문제점으로 볼 수 있는 것은 2가지 정도로 보이네요.
문제 1. 많은 양의 문자열 → 많은 양의 문자열을 출력하고 있다는 건 메모리가 점점 늘어난 다는 것이죠. 이 데이터를 실시간으로만 보는 용도면 한 번씩 비워주고, 그게 아니면 어느 정도 쌓였을 때 DB나 로컬로 내보내서 문자열을 적당히 비워줍시다.
문제 2. 잦은 출력 → 출력은 많은 컴퓨터 리소스를 요구합니다. 데이터가 1000글자를 10번출력하는 것보다 1000글자를 10번 축적했다가 한 번에 출력하는게 더 좋습니다. 시간의 텀을 줘서 한 번씩 출력하게 하는건 어떠신지요?

5개의 좋아요

MVVM 패턴을 지키면서 대량의 데이터를 처리하는 것은 ReactiveUI의 주요 목적입니다.
도구를 배울 의지가 있으시다면 배워보시는 것도 좋을 거 같습니다.

만약 사용하지 않는다면, MVVM에서 MultiThread시 문제가 되는 부분은 사실 MultiThread 인 것 보다는 Dispatcher 처리를 어디서 하냐의 문제일 것 같습니다. 저는 개인적으로 대량의 데이터를 다루는 아키텍쳐에서는 queue 말고는 잘 안 떠오르네요.

4개의 좋아요

ConcurrentQueue 를 이용해서
들어오거나 수집된 요청을 pool에 넣어두고
resource 가 허용되는 선에서 빼서 해결한적은 있는데 맞는 해결책인지는 모르곘네요

4개의 좋아요

사내에서 작업중이라 공유는 어려우나 Heap Memory를 체크하면
DispatcherOperation에과 PriorityItem
CommandManager, Action 순으로 기하급수적으로 Memory사용량이 늘어나네요…

            {
                _items.Add(line);
            }));

코드는 다음과 같이 observableCollection items를
public IEnumerable Items → _items 구문으로 textBox에 binding 해서 사용중이구요…

퇴근 후 코드 정리해서 올려보겠습니다 ㅠㅠ

4개의 좋아요

이 문제는 메모리 문제도 있겠지만 Textbox를 사용한 것에도 문제가 있습니다.
원래 TextBox.append는 속도가 느리며 라인이 많아지면 더욱 느려집니다.
게다가 넣을 수 있는 텍스트 양에도 한계가 있을 겁니다.

따라서 하나의 TextBox에 Text를 계속 추가하는 것으로는 해결이 될 수 없을 겁니다.

차라리 로그 한 줄 또는 로그 그룹을 TextBlock에 표시하고 StackPanel을 Virtualization하는 형태로 하던지, 또는 이런 기능을 제공하는 C++로 개발되어 있는 서드파티 ActiveX TextBox 컴포넌트를 사용하는 것이 나을 것 같네요. 근데 .NET Core WPF에서는 COM 컴포넌는 사용할 수 없을 것 같네요.

또 다른 방법으로는 하나의 TextBox에 일정 라인수가 넘어가면 (예를 들면 1000라인) TextBox를 지우고 새로 Append를 하는 방법이 있습니다. 제가 개발했던 프로그램에서 화면 로그 표시를 위해서 로그 파일에는 모두 기록하고 화면에는 500라인이 넘어가면 TextBox를 지우고 새로 append를 하게 했었네요.

이 것도 안된다면 WPF에서 Console Window를 연 후 거기에 console.writeline으로 로그를 기록할 수도 있을 겁니다. 다만 .NET Framework에서는 되는데 .NET Core WPF 에서도 되는지는 모르겠습니다.

그리고, 어차피 UI 업데이트는 UI 스레드에서밖에 안되기 때문에 멀티 스레드로 UI 업데이트를 할 수는 없습니다. 게다가 대량의 로그를 화면에 표시하는 것은 MVVM과 맞지 않습니다.

2개의 좋아요