From 4dc2322fed10b8d3465d180c98371c5c99a0ebd0 Mon Sep 17 00:00:00 2001 From: 9700X_PC <9700X_PC@gmail.com> Date: Sun, 18 Jan 2026 12:18:34 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20UI=20=EC=9C=88?= =?UTF-8?q?=EB=8F=84=EC=9A=B0=EB=A5=BC=20=EB=8F=84=EC=9E=85=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EC=95=A0=ED=94=8C=EB=A6=AC=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=8B=9C=EC=9E=91=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- app/data/fast_parser.py | 27 ++++++- .../analysis_panel.cpython-311.pyc | Bin 17789 -> 17790 bytes .../__pycache__/main_window.cpython-311.pyc | Bin 16332 -> 17522 bytes app/ui/main_window.py | 69 ++++++++++++------ .../dashboard_view.cpython-311.pyc | Bin 55942 -> 56071 bytes main.py | 8 +- 7 files changed, 76 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index e4312f3..b701b4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ venv/ build/ -dist/ \ No newline at end of file +dist/ +__pycache__ \ No newline at end of file diff --git a/app/data/fast_parser.py b/app/data/fast_parser.py index 5ec27d4..5c3c82f 100644 --- a/app/data/fast_parser.py +++ b/app/data/fast_parser.py @@ -2,6 +2,10 @@ import os import numpy as np import os import numpy as np +import os +import numpy as np +import os +import numpy as np import polars as pl from typing import Optional @@ -9,10 +13,9 @@ class FastLogParser: CHUNK_SIZE = 84 @staticmethod - def parse_to_parquet(input_path: str, output_path: str = None) -> Optional[str]: + def parse(input_path: str) -> Optional[pl.DataFrame]: """ - Numpy 벡터 연산을 사용하여 MMI 바이너리 로그를 초고속으로 파싱 후 Parquet 저장. - (VDI/VDO 포함 모든 필드 완벽 구현) + Numpy 벡터 연산을 사용하여 MMI 바이너리 로그를 초고속으로 파싱 후 DataFrame 반환. """ if not os.path.exists(input_path): return None @@ -241,6 +244,24 @@ class FastLogParser: # [Optional] 여기서 역 이름 매핑이나 코드 변환을 수행할 수 있음 # (이전 대화의 Processor 로직을 여기에 통합해도 됨) + return df + + except Exception as e: + print(f"[FastParser] Error: {e}") + import traceback + traceback.print_exc() + return None + + @staticmethod + def parse_to_parquet(input_path: str, output_path: str = None) -> Optional[str]: + """ + MMI 바이너리 로그를 파싱하여 Parquet로 저장 (Wrapper) + """ + df = FastLogParser.parse(input_path) + if df is None: + return None + + try: if output_path is None: output_path = input_path.replace(".dat", ".parquet") diff --git a/app/ui/__pycache__/analysis_panel.cpython-311.pyc b/app/ui/__pycache__/analysis_panel.cpython-311.pyc index 6ac9fdf1362442ed67b1baf171ffe7e2b2d9bed2..bd632fb11a430790d8b2d2147abd74b1b77110f8 100644 GIT binary patch delta 127 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 diff --git a/main.py b/main.py index 9e155e4..0822e38 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ from PySide6.QtWidgets import QApplication from app.ui.main_window import MainWindow def main(): + # 시작 시간 측정 start_time = time.time() print(f"[STARTUP] Application starting at {time.strftime('%H:%M:%S')}") @@ -12,20 +13,19 @@ def main(): app = QApplication(sys.argv) print(f"[STARTUP] QApplication created in {time.time() - t0:.3f}s") - # 다크 테마나 스타일시트 적용 가능 + # 스타일 설정 print("[STARTUP] Setting style...") t0 = time.time() app.setStyle("Fusion") print(f"[STARTUP] Style set in {time.time() - t0:.3f}s") - # 역 정보는 파일 로드 시점에 자동으로 로드됨 (지연 로딩) - # TrackInfo.load_info() 호출 제거 - 불필요한 초기 로딩 방지 - + # 메인 윈도우 생성 (지연 로딩 적용됨) print("[STARTUP] Creating MainWindow...") t0 = time.time() window = MainWindow() print(f"[STARTUP] MainWindow created in {time.time() - t0:.3f}s") + # 윈도우 표시 print("[STARTUP] Showing window...") t0 = time.time() window.show()