피드로 돌아가기
Dev.toDatabase
원문 읽기
Rust Ownership 기반 메모리 최적화로 Lexer 할당 제거
Building a SQL Lexer in Rust: Why I Replaced `Vec<char>` with `&str` and `Ident(String)` with Spans
AI 요약
Context
초기 설계에서 Vec 기반 입력 처리와 Ident(String) 구조를 사용함에 따라 발생한 불필요한 메모리 할당 및 데이터 복제 문제 분석.
Technical Solution
- Vec를 &str로 대체하여 입력 버퍼 복제 제거 및 Lifetime 기반 Borrowing 구조 설계
- Ident(String) 구조를 Span { start, end, line, column } 기반으로 변경하여 토큰 내 데이터 중복 제거
- 원본 SQL 소스 텍스트를 Single Source of Truth로 유지하며 필요한 경우에만 바이트 범위로 텍스트를 복원하는 방식 채택
- Rust Enum의 크기가 가장 큰 Variant에 의해 결정되는 특성을 고려하여 Token 크기를 최적화하는 설계 적용
실천 포인트
- 입력 데이터의 복제본을 생성하는 대신 원본 데이터의 슬라이스(&str)와 Lifetime을 활용하는지 검토 - 토큰이나 메시지 객체 내에 전체 문자열을 포함하는 대신 인덱스 기반의 Span 구조를 사용하여 메모리 풋프린트 최소화 - Enum Variant의 데이터 크기가 전체 Enum 크기에 미치는 영향을 분석하여 데이터 구조 최적화